[HDU5765]Bonds
题意
给出一张\(n\)点\(m\)边无向连通图,求每条边出现在多少个割集中。
\(n\le20,m\le\frac{n(n-1)}{2}\)
sol
所谓割集,就是指把\(n\)个点分成两个集合后,两个集合分别都是连通的。
所以我们可以预处理出每一个点集是否连通。
考虑边\((u,v)\)。实际上\((u,v)\)要出现在割集中,\(u,v\)就必然在不同的点集中。
来一波总方案减不合法。
所有可行的割的方案减去\(u,v\)在同一个割集里面的方案。
\(u,v\)在同一个割集里面的方案实际上就是集合\(\{u,v\}\)的超集之和。高维前缀和搞一搞。
前面那个预处理每个点集是否连通,使用\(bfs\)处理。
处理出每个点集的相邻点集,每次\(bfs\)时候向外扩展一个节点,若未访问就丢到队列里面去。
复杂度\(O(n\log{n})\)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define ll long long
int gi()
{
int x=0,w=1;char ch=getchar();
while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if (ch=='-') w=0,ch=getchar();
while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return w?x:-x;
}
const int N = 1<<21;
int T,n,m,all,u[500],v[500],reach[N],able[N],sum,tot[N];
queue<int>Q;
inline int lowbit(int k){return k&-k;}
int main()
{
T=gi();
for (int zsy=1;zsy<=T;++zsy)
{
n=gi();m=gi();all=(1<<n)-1;sum=0;
memset(reach,0,sizeof(reach));
memset(able,0,sizeof(able));
memset(tot,0,sizeof(tot));
for (int i=1;i<=m;++i)
{
u[i]=gi();v[i]=gi();
reach[1<<u[i]]|=1<<v[i];
reach[1<<v[i]]|=1<<u[i];
}
for (int i=0;i<=all;++i)
reach[i]=reach[lowbit(i)]|reach[i^lowbit(i)];
for (int i=0;i<n;++i)
Q.push(1<<i),able[1<<i]=1;
while (!Q.empty())
{
int u=Q.front();Q.pop();
int tmp=reach[u];
while (tmp)
{
int v=u|lowbit(tmp);
if (!able[v]) able[v]=1,Q.push(v);
tmp^=lowbit(tmp);
}
}
for (int i=0;i<=all;++i)
if (able[i]&&able[i^all])
++sum,++tot[i];
sum>>=1;
for (int j=0;j<n;++j)
for (int i=all;i>=0;--i)
if ((i&(1<<j))==0) tot[i]+=tot[i|(1<<j)];
printf("Case #%d:",zsy);
for (int i=1;i<=m;++i)
printf(" %d",sum-tot[(1<<u[i])|(1<<v[i])]);
puts("");
}
}
[HDU5765]Bonds的更多相关文章
- HDU5765 Bonds 最小割极
http://acm.hdu.edu.cn/showproblem.php?pid=5765 题意:无向连通图,问每条边在几个最小割极上 思路:用位压形式,表示边的关系.g[1<<i]=1 ...
- HDU 5765 Bonds 巧妙状压暴力
题意:给一个20个点无向连通图,求每条边被多少个极小割集包括 分析:极小割集是边的集合,很显然可以知道,极小割集恰好吧原图分成两部分(这个如果不明白可以用反证法) 然后就是奉上官方题解:http:// ...
- QiQi and Bonds
只有链接:http://sdu.acmclub.com/index.php?app=problem_title&id=961&problem_id=23685 题意:现在有n个QiQi ...
- HDU 5765 Bonds(状压DP)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5765 [题目大意] 给出一张图,求每条边在所有边割集中出现的次数. [题解] 利用状压DP,计算不 ...
- HDU 5765 Bonds
比赛时候想了好久,不会.看了官方题解才会...... Bond是极小割边集合,去掉一个Bond之后,只会将原图分成两个连通块. 假设某些点构成的集合为 s(点集中的点进行状压后得到的一个十进制数),那 ...
- HDU.5765.Bonds(DP 高维前缀和)
题目链接 \(Description\) 给定一张\(n\)个点\(m\)条边的无向图.定义割集\(E\)为去掉\(E\)后使得图不连通的边集.定义一个bond为一个极小割集(即bond中边的任意一个 ...
- bonds
Linux--多网卡的7种Bond模式 http://www.cnblogs.com/lcword/p/5914089.html 七种网卡绑定模式详解: http://blog.csdn.net/w ...
- Why did I have a recovery trip
For more than a decade, I felt most at ease living out of a suitcase, never quite sure where I might ...
- 探索C#之微型MapReduce
MapReduce近几年比较热的分布式计算编程模型,以C#为例简单介绍下MapReduce分布式计算. 阅读目录 背景 Map实现 Reduce实现 支持分布式 总结 背景 某平行世界程序猿小张接到B ...
随机推荐
- [Python Study Notes]列表操作
列表操作 a.切片 >>> names = ["Alex","Tenglan","Eric","Rain&quo ...
- console那些你不曾知道的玩法
一.console最常见的四种方法: FireFox(58) Chrome(51) 二.打印对象: 平时想输出对象属性时,可以直接打印对象,对Object使用toString方法会得到 [Object ...
- 升级gitlab
https://gitlab.com/gitlab-org/gitlab-ce/tree/master/doc/update https://about.gitlab.com/update/#cent ...
- [bzoj3875] [Ahoi2014]骑士游戏
3875: [Ahoi2014]骑士游戏 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 844 Solved: 440[Submit][Status ...
- 微信小程序 sha1 实现密码加密
在utils中的util.js 文件中增加 函数 实现 字符串转换为16进制加密后的字符串 function encodeUTF8(s) { var i, r = [], c, x; for (i = ...
- qemu-trustzone编译&运行(包含linux内核的编译方法)
由于之前都是用的mtk6797开发板,回到实验室之后想要做实验的话需要弄一个支持trustzone的qemu,在这里记录一下我的编译和调试过程.本来最近一直忙着看论文和写论文,但是忽然发现自己在实验部 ...
- javaWeb页面实现下载
jsp页面发送请求,后台实现指定路径下的文件,在浏览器上完成下载功能.@RequestMapping(value = "downloadFile")public void down ...
- 老男孩Python全栈开发(92天全)视频教程 自学笔记07
day7课程内容: Python的编码解码 二进制 --->ASCII:只能存英文和拉丁字符,一个字符占一个字节,8位 ------->gb2312:只能6700多个中文,1980年 -- ...
- ReportView动态加载带参数的RDCL文件
在vs里新建一个winform程序"ReportViewTest",在form1中添加一个reportView控件,from1的load事件如下: private void For ...
- 【linux】启动apache遇到错误:httpd: Could not reliably determine the server's fully qualified domain name
1)进入apache的安装目录:(视个人安装情况而不同) [root@server ~]# cd /usr/local/apache/conf 2)编辑httpd.conf文件,搜索"#Se ...