题目链接

\(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. mysql登录报错:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

    在MySQL登录时出现Access denied for user 'root'@'localhost' (using password: YES) 拒绝访问 对于出现拒绝访问root用户的解决方案错 ...

  2. Java在线备份和还原MySQL数据库。

    2018年6月29日14:00:48 阅读数:1534 今天整了整整一整天,终于使用Java在线备份和还原MySQL数据库了,哎,备份倒是很快,就是在还原的时候遇到了一个问题,也不报错,结果将sql语 ...

  3. jmeter csv中获取带引号的数据详情

    最近在工作中,对jmeter实践的点滴的记录这里分享,不一定正确,仅供参考和讨论,有想法的欢迎留言.谈论. 1技巧1:从csv中获取带引号的数据详情 背景:我们从csv中获取数据,在jmeter中使用 ...

  4. 如何上传项目到Git

    1.首先下载Git,然后安装 我用的版本是Git-2.15.0-64-bit 2.在你的Git上创建一个新的Progect 创建完成后,会出现这样的窗口,红框圈出来的就是你的Git项目路径 3.在本地 ...

  5. 论文阅读笔记一:Tutorial on Gabor Filters

    时域下的一维Gabor滤波器: 可以将Gabor滤波器看作是两个输出两个相位的滤波器,分别在实数域和虚数域上. 实数域上滤波器为: 虚数域上滤波器为: 傅里叶变换为频域: 上述两个滤波器对频率敏感,为 ...

  6. linux 系统备份和恢复

    Linux不像windows,它不限制根用户存取任何东西,因此,你完全可以把一个分区上每一个的文件放入一个TAR文件中. 使用root用户切换到根目录 然后,使用下面的命令备份完整的系统: tar c ...

  7. vs2017初学c++环境配置及使用教程

    https://blog.csdn.net/jmpan_sjtu/article/details/79053169 https://blog.csdn.net/luoyu510183/article/ ...

  8. Html中,id、name、class、type的区别

    <input type="text" name="name" id="name" class="txt"> ...

  9. Multi-Fiber Networks for Video Recognition (MFNet)

    Motivation:减少时空网络的计算量,保持视频分类精度的基础上,使速度尽可能接近对应网络的2D版本. 为此提出 Multi-Fiber 网络,将复杂网络拆分成轻量网络的集成,利用 fibers ...

  10. centos 6.9安装python 3.6

    .下载源码包在官网按照需要下载到本地 wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tgz .解压源码包 tar -xvf Pyt ...