HDU5765 Bonds (高维前缀和)


题意:\(n(n<=20)\)个点\(m\)条边无向图,求每条边出现在多少个\(Bond\)里。一个图的\(cut\)指,对于一个图\(G\)的边集的某个子集\(E\),如果删除\(E\)中的所有边,原图不连通。一个图的\(Bond\)指,对于一个图\(G\),\(cut\)恰好使得图不连通的边集\(E\),即原图去除\(E\)后,形成两个连通图。

做法:首先,考虑如何求出所有的\(Bond\)。显然可以\(2^{20}\)枚举出点集\(A\),然后如果\(A\)和它的补集\(B\),分别都是联通的,那么他们之间的所有边构成一种合法的\(Bond\)。这里就需要预处理点集的联通形\(ok[s]\)。之后,考虑如何计算每条边出现在多少个\(Bond\)里,一种显然会\(TLE\)的方法是枚举所有的边和\(Bond\),即\(O(m2^n)\)。考虑对于一条边\(u-v\)的答案,就是在所有合法的\(Bond\)中,\(u\)和\(v\)分别属于\(Bond\)的两边。也就等于,所有的\(Bond\)的数目,去掉\(u-v\)都在一个集合内的数目。我们用\(f[s]\)表示,包含点集\(s\)的所有合法的集合的数目,显然可以先\(f[合法点集]=1\),然后做超集的高维前缀和,而\(f[(1<<u)|(1<<v)]\)就是包含\(u-v\)的合法集合的数目,用总的Bond数减去它就是该条边的答案。另外还有个坑点,一开始直接\(bfs\)这个图求\(ok[s]\),就\(TLE\)

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
#define IOS ios::sync_with_stdio(false)
#define pb push_back
#define Pii pair<int,int>
#define Ppi pair<Pii, int>
#define x first
#define y second
typedef long long ll;
const int N = 20;
inline void read(int &x) {x = 0; int f = 1; char c = getchar();while(!isdigit(c)) {if(c=='-')f=-1;c=getchar();}while(isdigit(c)) {x=x*10+c-'0';c=getchar();}x *= f;
}
using namespace std;
int n, m, LIM, u[444], v[444], f[1 << N | 5], G[N+3];
bool ok[1 << N | 5];
void init_ok() {for(int i = 0; i < n; ++i) ok[1<<i] = 1;for(int s = 0; s < (1<<n); ++s) {if(!ok[s]) continue;for(int i = 0; i < n; ++i) if( !(s&(1<<i)) && (s&G[i]) ) ok[s|(1<<i)] = 1;}
}
int main() {int T_T, KK = 0; read(T_T);while(T_T--) {read(n), read(m);LIM = (1<<n)-1;memset(G,0,sizeof(G));memset(ok,0,sizeof(ok)); memset(f,0,sizeof(f));for(int i = 0; i < m; ++i) {read(u[i]), read(v[i]);G[u[i]] |= (1<<v[i]);G[v[i]] |= (1<<u[i]);}init_ok();int ans = 0;for(int s = 0; s <= LIM-s; ++s)  if(ok[s] && ok[LIM-s]) {++ ans; f[s] = f[LIM-s] = 1;}for(int j = 0; j < n; ++j) for(int i = 0; i <= LIM; ++i) if(!(i & (1 << j))) f[i] += f[i|(1<<j)];printf("Case #%d:",++KK);for(int tmp, i = 0; i < m; ++i) {printf(" %d", ans - f[(1<<u[i])|(1<<v[i])]);} putchar('\n');}
}

高维前缀和模板

超集

for(int j = 0; j < n; ++j) for(int i = 0; i < (1 << n); ++i) if(!(i & (1 << j))) f[i] += f[i|(1<<j)];

子集

for(int j = 0; j < n; ++j)for(int i = 0; i< (1 << n); ++i)if(i & (1 << j)) f[i] += f[i^(1<<j)];

转载于:https://www.cnblogs.com/RRRR-wys/p/10330875.html

HDU5765 Bonds (高维前缀和)相关推荐

  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 Round #257 (Div. 1) D. Jzzhu and Numbers 高维前缀和 + 容斥

    传送门 文章目录 题意: 思路: 题意: 思路: 完全想不到容斥啊,看了半天也没看懂渍渍渍. 定义f[i]f[i]f[i]表示iii的超集个数,那么选择的方案就是2f[i]−12^{f[i]}-12f ...

  3. Deltix Round, Spring 2021 D. Love-Hate 随机化 + sos dp(高维前缀和)

    传送门 文章目录 题意: 思路: 题意: 给你nnn个朋友,一共有mmm种货币,一个朋友最多喜欢ppp种,用二进制给出111代表喜欢,让你选出最多的一个货币集合使得至少有⌈n2⌉\left \lcei ...

  4. ARC106E-Medals【hall定理,高维前缀和】

    正题 题目链接:https://atcoder.jp/contests/arc106/tasks/arc106_e 题目大意 nnn个员工,第iii个在[1,Ai][1,A_i][1,Ai​]工作,[ ...

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

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

  6. HDU5765 Bonds 最小割极

    http://acm.hdu.edu.cn/showproblem.php?pid=5765 题意:无向连通图,问每条边在几个最小割极上 思路:用位压形式,表示边的关系.g[1<<i]=1 ...

  7. BZOJ5092:[Lydsy1711月赛]分割序列(贪心,高维前缀和)

    Description 对于一个长度为n的非负整数序列b_1,b_2,...,b_n,定义这个序列的能量为:f(b)=max{i=0,1,...,n}((b_1 xor b_2 xor...xor b ...

  8. [JZOJ5952] 凯旋而归 ([BZOJ 5092]【Lydsy1711月赛】分割序列)【高维前缀和】【DP】

    Description 对于一个长度为m的序列a,记f(a)=max⁡((a1xor...xorai)+(ai+1xor...xoran)),i∈[0,m]f(a)=\max((a_1\ xor\ . ...

  9. sosdp(高维前缀和)学习笔记

    高维前缀和 我们先看一维前缀和 for(int i=1;i<=n;i++) s[i]+=s[i-1]; 那么二维前缀和 for(int i=1;i<=n;i++) for(int j=1; ...

最新文章

  1. 理解并自定义HttpHandler
  2. Python函数传参方式超级大汇总
  3. Journey to Un‘Goro 贪心,找规律,搜索(沈阳)
  4. Zabbix监控可视化
  5. HDOJ1394 Minimum Inversion Number【线段树】
  6. json反射java对象_Jackson通过反射将Json转化为java对象
  7. 2021牛客OI赛前集训营-交替【生成函数】
  8. 某大厂JVM常见面试题(二)吐血整理
  9. win10 hyper-v 虚拟机ping不通宿主机问题
  10. Java学习笔记——模块化
  11. 推荐系统实战-概念理解入门篇
  12. pandas时间序列与自回归ARIMA模型
  13. freeradius 3.0 时间限制_java锁之RateLimiter(限制访问速率)
  14. iOS CocoaPods:Updating local specs repositories一直停在那里了
  15. python lxml_python – lxml使用命名空间而不是ns0,ns1,
  16. kibana6.0版本汉化工具
  17. Python每日一练-----三点共线问题
  18. 数据结构课程设计-推箱子
  19. python人物抠图算法_Python实现AI自动抠图实例解析
  20. 超算对我们的生活有着什么样的影响?

热门文章

  1. 八大排序算法交换排序算法
  2. Java手写Hashmap(HashMap的基本用法)
  3. [JavaWeb-JDBC]JDBC_快速入门_idea jdbc连接Mysql数据库
  4. SQL5 将查询后的列重新命名(数据库的几种去重方法)
  5. Calendar Game POJ - 1082(关于日历的博弈问题)
  6. Fibonacci again and again HDU - 1848(尼姆博弈+SG函数的运用+SG函数详解)
  7. phpword 模板 多页_高中数学:各题型答题模板,吃透,灵活运用数学公式,解题更快!...
  8. cg word List 3
  9. 交叉验证中n_jobs=-1并行运算
  10. BIO、NIO 和 AIO