HDU 6350 Always Online (仙人掌图,最大流)

news/2024/12/22 15:02:28/

传送门

这道题真的是坑,竟然用ull,ll都会爆。

首先这是一个仙人掌图。题意让求任意两点最大流,再进行异或。先说最大流,对于环上任意两点最大流,就是两条路径最小的边和,这就等效于求出环中最小的边,使环上任意一条边都加上这条边,然后去掉最小边。这样会求出一棵树。我们将边按从大到小排序,每次向空图里加一条边(用并查集维护),那么加的这条边就是两个连通分量的最大流。

还是老方法。对于仙人掌图,(可以看这里),跑一边tarjan。对于树边,直接将他放入边集里,对于环,写一个函数单独处理,去掉环中最小边,加到其他边上去。将其他边加入边集(细节在代码中注释)。

最后就是 计算异或值得问题。本来应该是n^2,枚举两个连通分量的值,但由于n太大,由于w是32位,我们可以枚举每一位,看两个联通分量中这一位有多少个0和1,能够使答案异或为1的组合的数量,就对答案贡献了多少这一位的权值。

最后注意ull

#include<cstdio>
#include<cstring>
#include<map>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ll llINF=0x3f3f3f3f3f3f3f3f;
const int N=1e5+10;struct Edg{int u, v, nxt;ll w;
}e[N<<1], edg[N<<2], tmp[N<<1];int n, m, dfs_clock, dfn[N], low[N], head[N], cn, cnt;
int f[N], fa[N], pos[N];//pos是用来记录该点对应的那条边,这个点是这条边的指向。ull ans;
ll c[N][40][2];int _find(int x){return f[x]==x?x:f[x]=_find(f[x]);
}void init(){dfs_clock=0;cn=0; cnt=0; ans=0;for(int i=1; i<=n; i++){head[i]=-1, dfn[i]=0;f[i]=i;for(int j=0; j<=30; j++){c[i][j][0]=((i>>j)&1)^1;c[i][j][1]=(i>>j)&1;}}
}void addEdg(int u, int v, ll w){edg[cnt].u=u, edg[cnt].v=v, edg[cnt].w=w;edg[cnt].nxt=head[u],head[u]=cnt++;
}void cal_cir(int fir, int las, int q){int num=0, id=las;while(id!=fir){tmp[++num]=edg[pos[id]];//tmp是暂时存放环上的边id=fa[id];}tmp[++num]=edg[q];ll mn=llINF;for(int i=1; i<=num; i++){if(tmp[i].w<mn){mn=tmp[i].w; id=i;//找最小边}}for(int i=1; i<=num; i++){if(i!=id){e[++cn]=tmp[i];//加入边集e[cn].w+=mn;}}
}void tarjan(int u, int f){dfn[u]=low[u]=++dfs_clock;fa[u]=f;for(int i=head[u]; ~i; i=edg[i].nxt){int v=edg[i].v;if(v==f) continue;if(!dfn[v]) pos[v]=i, tarjan(v, u), low[u]=min(low[u], low[v]);else low[u]=min(low[u], dfn[v]);}for(int i=head[u]; ~i; i=edg[i].nxt){int v=edg[i].v;if(low[v]>dfn[u])e[++cn]=edg[i];//树边else if(dfn[v]>dfn[u]&&fa[v]!=u)cal_cir(u, v, i);//环}}bool cmp(Edg a, Edg b){return a.w>b.w;
}int main()
{int T;scanf("%d", &T);while(T--){scanf("%d%d", &n, &m);init();int u, v;ll w;for(int i=1; i<=m; i++){scanf("%d%d%lld", &u, &v, &w);addEdg(u, v, w);addEdg(v, u, w);}tarjan(1, -1);sort(e+1, e+1+cn, cmp);//边值排序for(int i=1; i<=cn; i++){int ta=_find(e[i].u), tb=_find(e[i].v);ll w=e[i].w;for(int j=0; j<=30; j++){if (w & (1ll << j)) {ans += c[ta][j][0] * c[tb][j][0] * (1ll << j);ans += c[ta][j][1] * c[tb][j][1] * (1ll << j);}else {ans += c[ta][j][0] * c[tb][j][1] * (1ll << j);ans += c[ta][j][1] * c[tb][j][0] * (1ll << j);}}f[ta]=tb;for(int j=0; j<=30; j++){c[tb][j][0]+=c[ta][j][0];//将每一位的数量统计到祖先节点上c[tb][j][1]+=c[ta][j][1];}}printf("%llu\n", ans);}return 0;
}
/*
100
3 3
1 2 5
2 3 6
3 1 5
5 4
1 2 1
2 3 2
3 4 3
4 5 4
10 13
1 2 1
2 3 2
2 4 4
3 4 5
4 10 8
10 9 6
4 9 7
4 5 11
5 6 13
6 4 7
4 7 1
4 8 1
7 8 1
8 10
1 2 1
2 3 2
2 4 4
4 5 4
4 6 4
5 6 5
6 7 6
6 8 6
7 8 7
3 4 3
*/

 


http://www.ppmy.cn/news/172590.html

相关文章

MTK Android5.1 单独调整主副麦的模拟增益PGA(MT6350_PMIC)

MTK Android5.1 单独调整主副麦的模拟增益PGA&#xff08;MT6350_PMIC&#xff09; 项目使用副麦消噪&#xff0c;但是副麦增益太小&#xff0c;需要单独修改副麦增益&#xff0c;使用工程模式APP和Audio Tuning Tool调整的MIC的Level4的值&#xff0c;都会同时调整主麦和副麦…

HDU 6350 Always Online(最大流+并查集)

Description 给出一个 n n 个点m" role="presentation" style="position: relative;">mm条边的无向图&#xff0c;任意两点之间至多两条路径&#xff0c;以 flow(s,t) f l o w ( s , t ) 表示 s,t s , t 两点之间的最大流&#xff0c;求 ∑1≤s&l…

zabbix通过SNMP V3监控华为防火墙USG6350

1.华为防火墙开启snmp V3(图形界面配置) 防火墙接口开启SNMP服务&#xff08;找到通往zabbix服务器的那个网络接口或VLAN&#xff0c;这步很重要&#xff01;&#xff09; 找到通往zabbix服务器的那个网络接口或VLAN 防火墙配置完成&#xff01; 2.配置zabbix服务器端 yum …

USG 6350 SFTP 配置

进入视图模式 system-view interface GigabitEthernet 1/0/0 service-manage ssh permit service-manage enable 启用 sftp sftp server enable VTY认证 user-interface vty 0 4 authentication-mode aaa protocol inbound ssh user privilege level 3 新建用户名为SFTP的…

[Linux Audio Driver] SM6350平台音频bring up ( 一 )

0. 背景 这个是高通5G平台&#xff0c;音频的内容改的比较多&#xff0c;比较直接的是platform.c就直接移动到vendor了&#xff1b;目前 高通那边的趋势还是把音频逐渐从kernel剥离&#xff0c;android 7/android 8的时候&#xff0c;machine driver&#xff0c;codec driver都…

华为USG6350防洪墙SNMP最简单功能配置

https://www.cnblogs.com/vincent-liang/p/7785089.html

spring cloud搭建(service)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

Markdown 语法的使用

1.标题的使用 #加空格 代表一级标题 &#xff0c;##加空格代表二级标题&#xff0c;一次类推&#xff0c;最多支持六级标题。 2.文本居中 <center>这是要居中的文本内容</center> 3.插入图片 方式简单粗暴 直接截图粘贴。 4.超链接 第一种&#xff1a;百度一…