HDU.5765.Bonds(DP 高维前缀和)
\(Description\)
给定一张\(n\)个点\(m\)条边的无向图。定义割集\(E\)为去掉\(E\)后使得图不连通的边集。定义一个bond为一个极小割集(即bond中边的任意一个真子集都不是割集)。
对每条边,求它在多少个bond中。
\(n\leq20,\quad n-1\leq m\leq\frac{n(n-1)}{2}\)。
\(Solution\)
首先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 高维前缀和)的更多相关文章
- SPOJ.TLE - Time Limit Exceeded(DP 高维前缀和)
题目链接 \(Description\) 给定长为\(n\)的数组\(c_i\)和\(m\),求长为\(n\)的序列\(a_i\)个数,满足:\(c_i\not\mid a_i,\quad a_i\& ...
- codeforces 938F(dp+高维前缀和)
题意: 给一个长度为n的字符串,定义$k=\floor{log_2 n}$ 一共k轮操作,第i次操作要删除当前字符串恰好长度为$2^{i-1}$的子串 问最后剩余的字符串字典序最小是多少? 分析: 首 ...
- HDU 5765 Bonds(状压DP)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5765 [题目大意] 给出一张图,求每条边在所有边割集中出现的次数. [题解] 利用状压DP,计算不 ...
- HDU 5765 Bonds 巧妙状压暴力
题意:给一个20个点无向连通图,求每条边被多少个极小割集包括 分析:极小割集是边的集合,很显然可以知道,极小割集恰好吧原图分成两部分(这个如果不明白可以用反证法) 然后就是奉上官方题解:http:// ...
- HDU 5765 Bonds
比赛时候想了好久,不会.看了官方题解才会...... Bond是极小割边集合,去掉一个Bond之后,只会将原图分成两个连通块. 假设某些点构成的集合为 s(点集中的点进行状压后得到的一个十进制数),那 ...
- HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化
HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化 n个节点n-1条线性边,炸掉M条边也就是分为m+1个区间 问你各个区间的总策略值最少的炸法 就题目本身而言,中规中矩的 ...
- LOJ2542 PKUWC2018 随机游走 min-max容斥、树上高斯消元、高维前缀和、期望
传送门 那么除了D1T3,PKUWC2018就更完了(斗地主这种全场0分的题怎么会做啊) 发现我们要求的是所有点中到达时间的最大值的期望,\(n\)又很小,考虑min-max容斥 那么我们要求从\(x ...
- cf449D. Jzzhu and Numbers(容斥原理 高维前缀和)
题意 题目链接 给出\(n\)个数,问任意选几个数,它们\(\&\)起来等于\(0\)的方案数 Sol 正解居然是容斥原理Orz,然而本蒟蒻完全想不到.. 考虑每一种方案 答案=任意一种方案 ...
- EOJ-3300 奇数统计(高维前缀和)
题目链接: https://acm.ecnu.edu.cn/problem/3300/ 题目大意: 给n个数,求在n个数中选两个数(可重复),使得这两个数的组合数是奇数,求总共有多少种取法. 解题思路 ...
随机推荐
- bzoj 2190
题意:求 题解:这题...数据范围是真小... 研究一下这一表达式,发现gcd(i,j)=1表示i,j互质,那么互质肯定能想到欧拉函数,可是欧拉函数要求j<i,那么我们变化一下:显然原矩阵是对称 ...
- 论文阅读笔记二十九:SSD: Single Shot MultiBox Detector(ECCV2016)
论文源址:https://arxiv.org/abs/1512.02325 tensorflow代码:https://github.com/balancap/SSD-Tensorflow 摘要 SSD ...
- Centos7上搭建ftp服务器
ftp服务器搭建 1.安装好centos系统,配好yum仓库 其中vsftpd源在这下载 http://rpmfind.net/linux/rpm2html/search.php?query=vsft ...
- D.Starry的神奇魔法(矩阵快速幂)
/*D: Starry的神奇魔法 Time Limit: 1 s Memory Limit: 128 MB Submit My Status Problem Description ...
- MyBatis - 1.入门
MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架. MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集. MyBatis可以使用简单的XML或注解 ...
- vue-all
http://v1-cn.vuejs.org/guide/ [1]. vue-cli [项目不完整,跳过]https://github.com/vuejs/vue-cli vue-cli-master ...
- js 函数参数为什么是按值传递?
首先说下,在js中有两大类数据类型: 基本类型和引用类型. 其次,基本类型有5种: Undefined,Null,Boolean,Number.String, 引用类型有一种: Object(Func ...
- HTML学习之给div高度设置百分比不生效的问题
这几天在学习HTML的知识,今天想做一个极为简单的页面,就是分为头部,内容和底部,本来用三个div即可,可是给div高度设置百分比时发现不生效,具体页面如下,非常简单. 下面是html部分: < ...
- [转]JAVA实现SFTP实例
http://www.cnblogs.com/chen1987lei/archive/2010/11/26/1888384.html 最近写的一个JAVA实现SFTP的实例: /** Created ...
- C#搭建Oauth2.0认证流程以及代码示例
我认为对于一个普遍问题,必有对应的一个简洁优美的解决方案.当然这也许只是我的一厢情愿,因为根据宇宙法则,所有事物总归趋于混沌,而OAuth协议就是混沌中的产物,不管是1...0a还是2.,单看版本号就 ...