[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 ...
随机推荐
- Ios App上传步骤
前言:作为一名IOS开发者,把开发出来的App上传到App Store是必须的.下面就来详细介绍下具体流程. 1.打开苹果开发者中心:https://developer.apple.com 打开后点击 ...
- python学习:匿名函数
Python 函数 lambda 匿名函数 -lambda 函数是一种快速定义单行的最小函数,可以用在任何需要函数的地方. def fun(x,y): return x*y fu ...
- 查看Zookeeper服务器状态信息的一些命令
1.Zookeeper服务器当前节点配置信息: echo conf|nc localhost 2181 2.cons:echo cons|nc localhost 2181 输出当前服务器所有客户端连 ...
- Conemu, Msys2 工具整合,提升windows下控制台工作效率
与windows cmd相比较git-bash这类的console工具好用很多,但是git-bash的命令和功能相对简单,功能扩展起来不方便,git-bash本身也是基于msys的. 昨天发现使用Ms ...
- ArrayList源码阅读
前言 数组是我们最常用最简单的数据结构,Java里对数组做了一个简单的包装,就是ArrayList,提供自动扩容的功能. 最常用法 list在我们日常代码中最为常用的做法是创建一个list,放入数据, ...
- Linux CentOs集群LVS+Keepalived负载均衡的实现
准备工作 环境:Win10下Centos6.4虚拟机. 负载均衡:两台(一主一备) LVS + Keepalived. HTTP服务器:3台. 给每台服务器配置IP 1.VIP(virtual ip ...
- Duilib第一步(I)-简介与环境搭建
Primus gradus et cognoscetis veritatem et veritas liberabit vos. --Johannes 8:32 Introduction Duili ...
- LINUX signal 信号
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
- position的四种定位方式:static、fixed、relative、absolute
position属性用来规定元素的定位类型和方式 ①position:static 默认值,没有定位,元素出现在正常的流中: ②position:fixed 固定定位 是相对于浏览器窗口来进行定位: ...
- ContentProvider工作过程
ContentProvider启动过程(通过query方法触发) ContentProvider.acquireProvider--> ApplicationContentResolver.ac ...