题目链接

\(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. java易错题----静态方法的调用

    class A{ public static String s="A.s"; } class B extends A{ public static String s="B ...

  2. 使用gulp进行代码压缩

    gulp是一个很不错的前端自动化工具,可以帮我们完成一些重复性操作,比如html.css和js代码的压缩.合并.混淆等,虽然这些操作可以通过一些在线工具帮我们实现,但不断重复地复制粘贴肯定比不上一句命 ...

  3. cf478d 线性dp好题

    /* 给定r个红块,g个绿块,按要求堆放 问当堆放成最大高度时,有多少种可能的堆放方式 排列要求:1.第i行放i块 2.每行同色 首先当然要确定能够放置几行 设红块有r个,绿块有g个,那么放置h行需要 ...

  4. jQuery之CSS选择器的处理机制

    <!DOCTYPE html><html lang="en"><head> <meta charset="utf-8" ...

  5. python一个用例,多组参数,多个结果

    在某种情况下,需要用不同的参数组合测试同样的行为,你希望从test case的执行结果上知道在测试什么,而不是单单得到一个大的 test case:此时如果仅仅写一个test case并用内嵌循环来进 ...

  6. OpenCV-Python入门教程1-图片

    首先感觉学习OpenCV-python最好的学习工具官方的英文文档. 官方英文教程:OpenCV-Python Tutorials 我使用的是anaconda里的 jupyter notebook.至 ...

  7. 史上最简单的SpringCloud教程 | 第二篇: 服务消费者(rest+ribbon)

    在上一篇文章,讲了服务的注册和发现.在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的.Spring cloud有两种服务调用方式,一种是ribbon+r ...

  8. php归档格式:phar文件详解(创建、使用、解包还原提取)

    转载一篇,突然遇到一个冷知识,phar的东东,貌似和jar.war是一种鬼. 重点使用一下下面这个东东,就能解包出来东东了. $phar = new Phar('lib/yunke.phar', 0) ...

  9. SP3734 PERIODNI - Periodni

    题解: 第一道笛卡尔树dp 会发现以一个点为分界 如果左边大于它右边大于它 那么大于的那部分是相互不影响的 于是我们对序列建立笛卡尔树 满足父亲节点的v<儿子节点的v 然后这棵树的中序遍历为原序 ...

  10. nginx做负载均衡 tomcat获得客户端真实ip

    因项目需要做tomcat2台机器的负载均衡,配置好负载环境后,发现tomcat的日志一律是我前置nginx代理服务器的ip 通过百度教材发现需要修改nginx的配置文件,修改代理头信息,传递给后方,后 ...