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

news/2024/12/22 15:09:46/

Description

给出一个 n n 个点m条边的无向图,任意两点之间至多两条路径,以 flow(s,t) f l o w ( s , t ) 表示 s,t s , t 两点之间的最大流,求 1s<tnstflow(s,t) ∑ 1 ≤ s < t ≤ n s ⊕ t ⊕ f l o w ( s , t )

Input

第一行一整数 T T 表示用例组数,每组用例首先输入两个整数n,m表示点数和边数,最后 m m 行每行输入三个整数u,v,w表示 u,v u , v 之间有一条流量为 w w 的边

(1T100,1n105,n1m32(n1),0w109)

Output

输出结果

Sample Input

2
3 3
1 2 5
2 3 6
3 1 5
5 6
1 2 5
2 3 6
3 1 5
3 4 6
4 5 5
5 3 6

Sample Output

27
116

Solution

由于两点之前至多两条路径,显然可知每条边至多属于一个环(否则两个环上的点之间至少有四条路径),两点之间最大流等于最小割,两点之间如果只有一条路径那么必然会割掉这条路径上边权最小值,两点之间如果有两条路径,那么有两种情况,一种是依旧断一条边权最小的边使得两点不可达,一种是断掉环上的两条边使得两点不可达. 同时注意到如果断环上两条边,那么其中一条必然是环上边权最小值,另一条需要根据两点的可达情况来选择,那么我们把每个环上边权最小的边删掉,将其边权加到该环所有剩余边的边权上,将该图变成一棵树,则该树上两点之间的最小割与原图这两点之间的最小割等价. 而求树上两点的最小割,只需类似 Kruskal K r u s k a l ,按边权从大到小加入边,用并查集维护连通分量,当前加入的边 uv u → v 的边权必然是 u u 所处集合点到v所处集合点的最小割,由于结果是要累加编号与最小割的异或和,故每个联通分量里需要维护二进制第 j j 位为0,1的数量,每次根据边权在第 j j 位的值来判断需要两个点集在该位的状态,注意到结果会爆long long,要用 unsigned long long u n s i g n e d l o n g l o n g

Code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
typedef unsigned long long ull;
#define maxn 100005
struct Edge
{int u,v,w,flag,next;
}edge[3*maxn];
int tot,head[maxn];
void add(int u,int v,int w)
{edge[tot].u=u,edge[tot].v=v,edge[tot].w=w,edge[tot].flag=0;edge[tot].next=head[u],head[u]=tot++;
}
int T,n,m,vis[maxn],pre[maxn];
vector<int>s,e; 
void dfs(int u,int id)
{vis[u]=1;for(int i=head[u];~i;i=edge[i].next){if(edge[i].flag)continue;edge[i].flag=edge[i^1].flag=1;int v=edge[i].v,w=edge[i].w;s.push_back(i);if(vis[v]){int mn=w;for(int i=s.size()-1;i>=0;i--){mn=min(mn,edge[s[i]].w);edge[s[i]].flag=2;//环边 if(edge[s[i]].u==v)break;}int flag=0;while(1){int temp=s.back();s.pop_back();if(!flag&&edge[temp].w==mn)flag=1;else{edge[temp].w+=mn;e.push_back(temp);}if(edge[temp].u==v)break;}continue;}dfs(v,i);}if(id!=-1&&edge[id].flag!=2){e.push_back(s.back());s.pop_back();}
}
bool cmp(int x,int y)
{return edge[x].w>edge[y].w;
}
int fa[maxn],num[maxn][31],Size[maxn];
int find(int x)
{if(fa[x]==x)return x;return fa[x]=find(fa[x]);
}
int main()
{scanf("%d",&T);while(T--){scanf("%d%d",&n,&m);tot=0;memset(head,-1,sizeof(head));while(m--){int u,v,w;scanf("%d%d%d",&u,&v,&w);add(u,v,w),add(v,u,w);}e.clear();memset(vis,0,sizeof(vis));dfs(1,-1);sort(e.begin(),e.end(),cmp);for(int i=1;i<=n;i++){fa[i]=i;Size[i]=1;for(int j=0;j<=30;j++)if((i>>j)&1)num[i][j]=1;else num[i][j]=0;}ull ans=0;for(int i=0;i<e.size();i++){int u=edge[e[i]].u,v=edge[e[i]].v,w=edge[e[i]].w;u=find(u),v=find(v);for(int j=0;j<=30;j++){ull res=0;if((w>>j)&1){res+=(ull)num[u][j]*num[v][j];res+=(ull)(Size[u]-num[u][j])*(Size[v]-num[v][j]);}else{res+=(ull)num[u][j]*(Size[v]-num[v][j]);res+=(ull)(Size[u]-num[u][j])*num[v][j];}ans+=(1ull<<j)*res;}for(int j=0;j<=30;j++)num[v][j]+=num[u][j];fa[u]=v,Size[v]+=Size[u];}printf("%llu\n",ans);}return 0;
}

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

相关文章

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;百度一…

“超低能,劲搞笑”笑话管理系统 v2.0

导读&#xff1a; 1、常规管理 网站管理、公告管理、发布公告、留言管理、模板管理、评论管理 2、FSO生成管理 生成首页、生成栏目、生成内容页 3、文章管理 发表文章、文章管理、栏目管理 默认后台地址:admin/login.asp 用户名admin 密码admin 上传后需要重新生成所…

英语字母的搞笑故事

我们看习惯了汉语的笔画,刚接触英语字母时会觉得抵触,不容易接受.仿佛字母仅仅是一个枯燥无趣的符号.如果我们把每一个英语字母都与一些有趣的事联起来,看着英语时就更有感觉点啊.当然至于什么是有趣的事,这个就较难说,要看每个人的经验,爱好. 英语字母为什么26个 假如你设计…