HDU 5765 Bonds
比赛时候想了好久,不会。看了官方题解才会......
Bond是极小割边集合,去掉一个Bond之后,只会将原图分成两个连通块。
假设某些点构成的集合为 s(点集中的点进行状压后得到的一个十进制数),那么剩下的点构成的集合为 t=(1<<n)-1-s
如果s是连通的,t也是连通的,那么跨越s、t集合的边的答案就+1(即跨越s、t集合的边构成一个Bond)。
因此,只需枚举 s 即可。
接下来问题转变成了以下两个问题:
1.如何判断某个点集合是否连通:状压DP预处理。
2.如何让跨越s、t集合的边的答案+1:如果每次遍历所有的边去加答案,时间复杂度爆炸O(m*(1<<n)),因此需要换一种思路:
我们可以计算出所有Bond有几个,然后减去(u,v)不跨越s,t的Bond个数就是(u,v)这条边的答案。
具体看代码吧~~,再贴上官方题解:

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;
typedef long long LL;
const double pi=acos(-1.0),eps=1e-;
void File()
{
freopen("D:\\in.txt","r",stdin);
freopen("D:\\out.txt","w",stdout);
}
inline int read()
{
char c = getchar(); while(!isdigit(c)) c = getchar();
int x = ;
while(isdigit(c)) { x = x * + c - ''; c = getchar(); }
return x;
} int T,n,m,e[],sum[(<<)+],sz;
int u[],v[];
bool f[(<<)+]; void pre()
{
for(int i=;i<n;i++) f[<<i]=;
for(int i=;i<(<<n);i++)
{
if(!f[i]) continue;
int st=; for(int j=;j<n;j++) if(i&(<<j)) st=st|e[j];
for(int j=;j<n;j++)
{
if(i&(<<j)) continue;
if(st&(<<j)) f[i|(<<j)]=;
}
}
} int main()
{
scanf("%d",&T); int cas=;
while(T--)
{
scanf("%d%d",&n,&m);
memset(e,sz=,sizeof e); memset(f,,sizeof f); memset(sum,,sizeof sum);
for(int i=;i<m;i++)
{
scanf("%d%d",&u[i],&v[i]);
e[u[i]]=e[u[i]]|(<<v[i]), e[v[i]]=e[v[i]]|(<<u[i]);
}
pre();
for(int i=;i<(<<n);i++)
{
if(f[i]==||f[(<<n)--i]==) continue;
if(i>(<<n)--i) break;
sum[i]=; sum[(<<n)--i]=; sz++;
}
for(int i=;i<n;i++)
{
for(int j=(<<n)-;j>=;j--)
{
if((<<i)&j) continue;
sum[j]=sum[j]+sum[(<<i)|j];
}
}
printf("Case #%d:",cas++);
for(int i=;i<m;i++) printf(" %d",sz-sum[(<<u[i])|(<<v[i])]);
printf("\n");
}
return ;
}
HDU 5765 Bonds的更多相关文章
- HDU 5765 Bonds(状压DP)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5765 [题目大意] 给出一张图,求每条边在所有边割集中出现的次数. [题解] 利用状压DP,计算不 ...
- HDU 5765 Bonds 巧妙状压暴力
题意:给一个20个点无向连通图,求每条边被多少个极小割集包括 分析:极小割集是边的集合,很显然可以知道,极小割集恰好吧原图分成两部分(这个如果不明白可以用反证法) 然后就是奉上官方题解:http:// ...
- HDU.5765.Bonds(DP 高维前缀和)
题目链接 \(Description\) 给定一张\(n\)个点\(m\)条边的无向图.定义割集\(E\)为去掉\(E\)后使得图不连通的边集.定义一个bond为一个极小割集(即bond中边的任意一个 ...
- HDU5765 Bonds 最小割极
http://acm.hdu.edu.cn/showproblem.php?pid=5765 题意:无向连通图,问每条边在几个最小割极上 思路:用位压形式,表示边的关系.g[1<<i]=1 ...
- [HDU 1963] Investment
Investment Time Limit:10000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu Descrip ...
- HDOJ 2111. Saving HDU 贪心 结构体排序
Saving HDU Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 【HDU 3037】Saving Beans Lucas定理模板
http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...
- hdu 4859 海岸线 Bestcoder Round 1
http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...
- HDU 4569 Special equations(取模)
Special equations Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u S ...
随机推荐
- 页面导入样式时,使用link和@import有什么区别?
1 link属于XHTML标签,而@import是CSS提供的: 2 页面被加载的时,link会同时被加载,而@import引用的CSS会等到页面被加载完再加载: 3 import只有在IE5以上才能 ...
- LeetCode #3. Longest Substring Without Repeating Characters C#
Given a string, find the length of the longest substring without repeating characters. Examples: Giv ...
- redis - 主从复制与主从切换
redis2.8之前本身是不支持分布式管理的,一般建议使用redis3.0及以后版本 redis主从切换的方法 keepalive 或者 使用sentinel线程管理 说明如何使用sentinel实 ...
- 怎么给当前点击的a标签添加一个样式(跳转页面后)
怎么给当前点击的a标签添加一个样式(跳转页面后): 方法1. 用cookie记录这个打开的序列号,然后页面在跳转的时候在读出来.方法2. 循环a的链接,然后与location.href去比对,如果相同 ...
- 训练[2]-DFS
题目A: 题目B[https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_pro ...
- fpSpread 设置Border 样式
// Create a new bevel border. //FarPoint.Win.BevelBorder bevelbrdr = new FarPoint.Win.BevelBorder(Fa ...
- ActionBar之style出现Cannot resolve symbol 'Theme' 错误
今天 2014/03/08 00:49 刚刚升级 android studio 到了 0.5.0 版本,修复了许多 bug,包含当前这个问题,之前一直困扰我很久,莫名奇妙的提示主题样式找不到,无法解析 ...
- hdu 3631 Shortest Path
floyd算法好像很奇妙的样子.可以做到每次加入一个点再以这个点为中间点去更新最短路,效率是n*n. #include<cstdio> #include<cstring> #i ...
- Linux性能监测:CPU篇(转)
http://os.51cto.com/art/201012/239880.htm CPU 的占用主要取决于什么样的资源正在 CPU 上面运行,比如拷贝一个文件通常占用较少 CPU,因为大部分工作是由 ...
- C#.NET的微信功能开发学习
对于新手的我来说,我不是申请一个微信公众号认证后进行开发,我是申请一个订阅号,然后通过自己申请的订阅号的公众平台测试号来学习. 一,申请后成功后,打开开发者工具-公众平台测试号 二,进去公众平台测试号 ...