题目链接

\(Description\)

给定一张\(n\)个点\(m\)条边的无向图。定义割集\(E\)为去掉\(E\)后使得图不连通的边集。定义一个bond为一个极小割集(即bond中边的任意一个真子集都不是割集)。

对每条边,求它在多少个bond中。

\(n\leq20,\quad n-1\leq m\leq\frac{n(n-1)}{2}\)。

\(Solution\)

https://www.cnblogs.com/zufezzt/p/5723389.html

首先bond是极小割集,所以一定是将图分成了两个连通块

状压表示点集,如果\(s\)是一个连通块,且剩下的所有点\(s'=2^n-1-s\)也是一个连通块,那么\(s\)与\(s'\)之间的边就形成了一个bond,这些边的\(ans\)++。

所以,我们只需要枚举一个连通块\(s\)。

然后怎么统计边的答案呢?显然不能枚举一遍bond中的边,那样复杂度就成了\(O(2^nm)\)。

总的bond个数可以这样求出来。

如果一条边\((u,v)\)不在bond中,显然\(u,v\)此时在同一连通块中。也就是我们求一下\(u,v\)在同一连通块时bond有多少个,就是这条边不在多少个bond中了。用总个数一减就可以得到这条边的答案。

\(u,v\)在同一连通块时bond的个数,就是包含\(\{u,v\}\)的集合中有多少个bond。那么就可以用高维前缀和枚举超集得到答案了。

复杂度\(O(2^nn)\)。

还有一个问题是,要预处理哪些集合是一个连通块。

递推一下,枚举当前已经是一个连通块的点集,那么每次加入一个与该点集相邻的点,形成的仍然是一个连通块。

复杂度也是\(O(2^nn)\)。

写的代码有好多可以优化的地方QAQ

就是注释的那两部分那。。

感谢MilkyWay dalao啦。

//624MS	9416K
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define gc() getchar()
typedef long long LL;
const int N=(1<<20)+4; int e[25],f[N],sum[N]; inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
void Pre(int n)
{
for(int i=0; i<n; ++i) f[1<<i]=1;//not f[i]...
for(int s=0,lim=1<<n; s<lim; ++s)
{
if(!f[s]) continue;
for(int i=0; i<n; ++i)
if(!(s>>i&1) && s&e[i]) f[s|(1<<i)]=1;
// int adj=0;
// for(int i=0; i<n; ++i) s>>i&1&&(adj|=e[i]);
// for(int i=0; i<n; ++i)
// if(!(s>>i&1) && adj>>i&1) f[s|(1<<i)]=1;
}
} int main()
{
static int u[500],v[500]; for(int TT=read(),T=1; T<=TT; ++T)
{
int n=read(),m=read(),lim=1<<n;
memset(e,0,sizeof e), memset(f,0,lim<<2), memset(sum,0,lim<<2);
for(int i=1; i<=m; ++i)
u[i]=read(), v[i]=read(), e[u[i]]|=1<<v[i], e[v[i]]|=1<<u[i];
Pre(n);
int tot=0;
for(int s=0; s<lim; ++s)
{
if(!f[s]||!f[lim-1-s]) continue;
if(s>lim-1-s) break;
sum[s]=1, sum[lim-1-s]=1, ++tot;
}
for(int i=0; i<n; ++i)
for(int s=0; s<lim; ++s)
if(!(s>>i&1)) sum[s]+=sum[s|(1<<i)];
// for (int i = 1; i <= s; i += 2)
// if (f[i] ^ f[s ^ i]) f[i] = f[s ^ i] = 0; else if (f[i]) ++tot;
// for (int i = 0; i < n; ++i)
// for (int j = 0; j <= s; ++j)
// if (!(j & (1 << i))) f[j] += f[j | (1 << i)];
printf("Case #%d:",T);
for(int i=1; i<=m; ++i)
printf(" %d",tot-sum[(1<<u[i])|(1<<v[i])]);
putchar('\n');
}
return 0;
}

HDU.5765.Bonds(DP 高维前缀和)的更多相关文章

  1. SPOJ.TLE - Time Limit Exceeded(DP 高维前缀和)

    题目链接 \(Description\) 给定长为\(n\)的数组\(c_i\)和\(m\),求长为\(n\)的序列\(a_i\)个数,满足:\(c_i\not\mid a_i,\quad a_i\& ...

  2. codeforces 938F(dp+高维前缀和)

    题意: 给一个长度为n的字符串,定义$k=\floor{log_2 n}$ 一共k轮操作,第i次操作要删除当前字符串恰好长度为$2^{i-1}$的子串 问最后剩余的字符串字典序最小是多少? 分析: 首 ...

  3. HDU 5765 Bonds(状压DP)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5765 [题目大意] 给出一张图,求每条边在所有边割集中出现的次数. [题解] 利用状压DP,计算不 ...

  4. HDU 5765 Bonds 巧妙状压暴力

    题意:给一个20个点无向连通图,求每条边被多少个极小割集包括 分析:极小割集是边的集合,很显然可以知道,极小割集恰好吧原图分成两部分(这个如果不明白可以用反证法) 然后就是奉上官方题解:http:// ...

  5. HDU 5765 Bonds

    比赛时候想了好久,不会.看了官方题解才会...... Bond是极小割边集合,去掉一个Bond之后,只会将原图分成两个连通块. 假设某些点构成的集合为 s(点集中的点进行状压后得到的一个十进制数),那 ...

  6. HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化

    HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化 n个节点n-1条线性边,炸掉M条边也就是分为m+1个区间 问你各个区间的总策略值最少的炸法 就题目本身而言,中规中矩的 ...

  7. LOJ2542 PKUWC2018 随机游走 min-max容斥、树上高斯消元、高维前缀和、期望

    传送门 那么除了D1T3,PKUWC2018就更完了(斗地主这种全场0分的题怎么会做啊) 发现我们要求的是所有点中到达时间的最大值的期望,\(n\)又很小,考虑min-max容斥 那么我们要求从\(x ...

  8. cf449D. Jzzhu and Numbers(容斥原理 高维前缀和)

    题意 题目链接 给出\(n\)个数,问任意选几个数,它们\(\&\)起来等于\(0\)的方案数 Sol 正解居然是容斥原理Orz,然而本蒟蒻完全想不到.. 考虑每一种方案 答案=任意一种方案 ...

  9. EOJ-3300 奇数统计(高维前缀和)

    题目链接: https://acm.ecnu.edu.cn/problem/3300/ 题目大意: 给n个数,求在n个数中选两个数(可重复),使得这两个数的组合数是奇数,求总共有多少种取法. 解题思路 ...

随机推荐

  1. JavaScript实现的抛物线运动效果

    css88 技术文档地址: http://www.css88.com/archives/5355 张鑫旭 技术文档地址: https://www.zhangxinxu.com 使用示例: 使用时直接引 ...

  2. Eclipse中java文件生成jar文件的方法

    在eclpse中找到你要导出的java程序 选中它   单击文件 -->export   在弹出的export对话框中找到 jar File 单击选中-->next   按图示顺序依次 选 ...

  3. Python知乎热门话题数据的爬取实战

    import requestsfrom pyquery import PyQuery as pq url = 'https://www.zhihu.com/explore'headers = { 'u ...

  4. python datetime.datetime is not JSON serializable

    1.主要是python  list转换成json时对时间报错:datetime.datetime(2014, 5, 23, 9, 33, 3) is not JSON serializable. 2. ...

  5. Python自定义-分页器

    Python自定义-分页器 分页功能在每个网站都是必要的,对于分页来说,其实就是根据用户的输入计算出应该在数据库表中的起始位置. 1.设定每页显示数据条数 2.用户输入页码(第一页.第二页...) 3 ...

  6. 实现用VB.Net/(C#)开发K/3 BOS 插件的真正可行方法

    转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用的爽呀,这篇文章写与2011年,看来我以前没有认真去找这个方法呀. https://blog.csdn.net/chzjxgd/arti ...

  7. .Net页面缓存OutPutCache详解

    一 它在Web.Config中的位置 <system.web> <!--页面缓存--> <caching> <outputCacheSettings> ...

  8. INFO JobScheduler: Added jobs for time 1524468752000 ms/INFO MemoryStore: Block input-0-1524469143000 stored as bytes in memory/完全分布式 ./bin/run-example streaming.NetworkWordCount localhost 9999无法正常运行

    1.完全分布式  ./bin/run-example streaming.NetworkWordCount localhost 9999无法正常运行: 1 [hadoop@slaver1 spark- ...

  9. Linux环境安装Eclipse工具开发

    1.官网下载maven:https://maven.apache.org/download.cgi 2.上传到虚拟机进行解压缩操作: [hadoop@slaver1 package]$ tar -zx ...

  10. 17/11/24 05:08:44 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

    2017-11-24 21:20:25 1:什么叫失望,什么叫绝望.总之是一脸懵逼的继续...... 之前部署的hadoop都是hadoop-2.4.1.tar.gz,这几天换成了hadoop-2.6 ...