定理:n个点的无向图的最小割最多n-1个。

可能从某种形式上形成了一棵树,不是很清楚。

最小割分治:先任选两个点求一边最小割,然后将两边分别递归,就能找到所有的最小割。

这两个题是一样的,直接搬dinic模板即可。

BZOJ2229:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<vector>
 5 #define mem(a,k) memset(a,k,sizeof(a))
 6 #define rep(i,l,r) for (int i=l; i<=r; i++)
 7 #define For(i,x) for (int i=h[x],k; i; i=e[i].nxt)
 8 using namespace std;
 9
10 const int N=160,inf=1000000000;
11 int m,n,u,v,w,x,S,T,TT,Q,tot,cnt,tmp[N],a[N],b[N],d[N],q[N*10],h[N],ans[N][N];
12 struct E{ int to,nxt,v; }e[7010];
13 bool mark[N];
14
15 void add(int u,int v,int w){
16    e[++cnt]=(E){v,h[u],w}; h[u]=cnt;
17    e[++cnt]=(E){u,h[v],w}; h[v]=cnt;
18 }
19
20 bool bfs(){
21     mem(d,0); q[1]=S; d[S]=1;
22     for (int st=0,ed=1; st!=ed; ){
23         int x=q[++st];
24         For(i,x) if (e[i].v && !d[k=e[i].to])
25             d[k]=d[x]+1,q[++ed]=k;
26     }
27     return d[T];
28 }
29
30 int dfs(int x,int lim){
31     if (x==T) return lim;
32     int t,c=0;
33     For(i,x) if (d[k=e[i].to]==d[x]+1){
34         t=dfs(k,min(lim-c,e[i].v));
35         e[i].v-=t; e[i^1].v+=t; c+=t;
36         if (c==lim) return lim;
37     }
38     if (!c) d[x]=-1; return c;
39 }
40
41 int dinic(){ int ans=0; while(bfs()) ans+=dfs(S,inf); return ans; }
42
43 void get(int x){
44     mark[x]=1; For(i,x) if (!mark[k=e[i].to] && e[i].v) get(k);
45 }
46
47 void solve(int l,int r){
48     if (l==r) return;
49     S=a[l]; T=a[r]; int t=dinic();
50     mem(mark,0); get(S); int p=l,p0;
51     rep(i,1,n) if (mark[i]) rep(j,1,n) if (!mark[j]) ans[i][j]=ans[j][i]=min(ans[i][j],t);
52     for (int i=2; i<=cnt; i+=2) e[i].v=e[i^1].v=(e[i].v+e[i^1].v)>>1;
53     rep(i,l,r) if (mark[a[i]]) tmp[p++]=a[i];
54     p0=p;
55     rep(i,l,r) if (!mark[a[i]]) tmp[p++]=a[i];
56     rep(i,l,r) a[i]=tmp[i];
57     solve(l,p0-1); solve(p0,r);
58 }
59
60 int main(){
61     freopen("bzoj2229.in","r",stdin);
62     freopen("bzoj2229.out","w",stdout);
63     for (scanf("%d",&TT); TT--; ){
64         cnt=1; mem(h,0); mem(ans,0x3f);
65         scanf("%d%d",&n,&m);
66         rep(i,1,m) scanf("%d%d%d",&u,&v,&w),add(u,v,w);
67         rep(i,1,n) a[i]=i; solve(1,n);
68         for (scanf("%d",&Q); Q--; ){
69             scanf("%d",&x); tot=0;
70             rep(i,1,n-1) rep(j,i+1,n) if (ans[i][j]<=x) tot++;
71             printf("%d\n",tot);
72         }
73         puts("");
74     }
75     return 0;
76 }

BZOJ4519:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<vector>
 5 #define rep(i,l,r) for (int i=l; i<=r; i++)
 6 #define For(i,x) for (int i=h[x],k; i; i=e[i].nxt)
 7 using namespace std;
 8
 9 const int N=1010,inf=1000000000;
10 int m,n,u,v,w,S,T,tot,cnt=1,tmp[N],a[N],b[N],d[N],q[N],h[N];
11 struct E{ int to,nxt,v; }e[20010];
12 bool mark[N];
13
14 void add(int u,int v,int w){
15    e[++cnt]=(E){v,h[u],w}; h[u]=cnt;
16    e[++cnt]=(E){u,h[v],w}; h[v]=cnt;
17 }
18
19 bool bfs(){
20     memset(d,0,sizeof(d)); q[1]=S; d[S]=1;
21     for (int st=0,ed=1; st!=ed; ){
22         int x=q[++st];
23         For(i,x) if (e[i].v && !d[k=e[i].to])
24             d[k]=d[x]+1,q[++ed]=k;
25     }
26     return d[T];
27 }
28
29 int dfs(int x,int lim){
30     if (x==T) return lim;
31     int t,c=0;
32     For(i,x) if (d[k=e[i].to]==d[x]+1){
33         t=dfs(k,min(lim-c,e[i].v));
34         e[i].v-=t; e[i^1].v+=t; c+=t;
35         if (c==lim) return lim;
36     }
37     if (!c) d[x]=-1; return c;
38 }
39
40 int dinic(){ int ans=0; while(bfs()) ans+=dfs(S,inf); return ans; }
41
42 void get(int x){
43     mark[x]=1;
44     For(i,x) if (!mark[k=e[i].to] && e[i].v) get(k);
45 }
46
47 void solve(int l,int r){
48     if (l==r) return;
49     S=a[l]; T=a[r]; b[++tot]=dinic();
50     memset(mark,0,sizeof(mark));
51     get(S); int p=l,p0;
52     for (int i=2; i<=cnt; i+=2) e[i].v=e[i^1].v=(e[i].v+e[i^1].v)>>1;
53     rep(i,l,r) if (mark[a[i]]) tmp[p++]=a[i];
54     p0=p;
55     rep(i,l,r) if (!mark[a[i]]) tmp[p++]=a[i];
56     rep(i,l,r) a[i]=tmp[i];
57     solve(l,p0-1); solve(p0,r);
58 }
59
60 int main(){
61     freopen("bzoj4519.in","r",stdin);
62     freopen("bzoj4519.out","w",stdout);
63     scanf("%d%d",&n,&m);
64     rep(i,1,m) scanf("%d%d%d",&u,&v,&w),add(u,v,w);
65     rep(i,1,n) a[i]=i;
66     solve(1,n); sort(b+1,b+tot+1); tot=unique(b+1,b+tot+1)-b-1;
67     printf("%d\n",tot);
68     return 0;
69 }

转载于:https://www.cnblogs.com/HocRiser/p/9063144.html

最小割分治(最小割树):BZOJ2229 BZOJ4519相关推荐

  1. 分治最小割 学习总结

    这是一种可以较快的求解任意两点间最小割的算法 正常的暴力的话我们要枚举点对,一共要做O(n^2)次网络流 而我们注意到设某一个S->T最小割中两个点x,y,满足x在S集合且y在T集合中 设S-& ...

  2. [学习笔记]最小割之最小点权覆盖最大点权独立集

    最小点权覆盖 给出一个二分图,每个点有一个非负点权 要求选出一些点构成一个覆盖,问点权最小是多少 建模: S到左部点,容量为点权 右部点到T,容量为点权 左部点到右部点的边,容量inf 求最小割即可. ...

  3. 【网络流24题】B、太空飞行计划问题(最大权闭合图转最小割、最小割方案输出)

    整理的算法模板合集: ACM模板 B.太空飞行计划问题(最大权闭合图转最小割.最小割方案输出)[省选/NOI- ] P2762 太空飞行计划问题 [问题分析] 最大权闭合图问题,可以转化成最小割问题, ...

  4. 树的同构模板题(法1.最小表示法+法2.树哈希)

    树的同构 problem solution code solution code problem 模板题 solution Ⅰ. 最小表示法 将树转化为 0/10/10/1 括号序列:从根开始 dfs ...

  5. 贪心法求树的最小支配集,最小点覆盖,最大独立集

    原文地址(转自 Ashly的博客) 定义: 最小支配集:对于图G = (V, E) 来说,最小支配集指的是从 V 中取尽量少的点组成一个集合, 使得 V 中剩余的点都与取出来的点有边相连.也就是说,设 ...

  6. 树形DP求树的最小支配集,最小点覆盖,最大独立集

    转自:https://www.cnblogs.com/Ash-ly/p/5783877.html 一:最小支配集 考虑最小支配集,每个点有两种状态,即属于支配集合或者不属于支配集合,其中不属于支配集合 ...

  7. 【每日算法】【图论】【最小边覆盖 最小路径覆盖 最小顶点覆盖 最大独立集 最大团】

    最小边覆盖 = 最大独立集 = |V| - 最大匹配数 这个是在原图是二分图上进行的 最小路径覆盖和最小边覆盖不同,不要求给的图是二分图,而是要求是N x N的有向图,不能有环,然后根据原图构造二分图 ...

  8. Bayes决策理论(一):最小错误率和最小风险决策

    Bayes决策理论(一):最小错误率和最小风险决策 Bayes定理 符号:wi 表示类别:x表示待分类的样本或者其特征:p(wi)为类别的先验概率,表示每个类别在所有类别中出现的概率:p(x|wi)为 ...

  9. 最小堆实现最小优先队列

    最小优先队列的可以实现的操作: insert,插入一个元素 min,找到最小的元素 extract-min,去掉最小的元素并返回最小的元素 increase-key,增加一个关键字的值 优先队列的形式 ...

最新文章

  1. java8 wordcount_Spark2.x与Java8下WordCount示例
  2. pandas drop 删除行和列的方法
  3. django 快速实现完整登录系统(cookie)
  4. MySQL索引知识点
  5. powerdesigner15(pd)+Oracle 11g 开发小问题
  6. 回溯算法 思路清晰,通俗易懂!!!!!!!
  7. 从一次线上故障思考Java问题定位思路,java初级面试笔试题
  8. 基于JAVA+SpringMVC+Mybatis+MYSQL的智能养生平台系统
  9. SAP License:对煤化工行业的几点思考
  10. 使用Maven前夕(Maven项目架构管理工具、配置环境变量、阿里云镜像、本地仓库)
  11. RN开发研究入门篇(一)项目搭建
  12. 音创服务器系统手动加歌,音创ktv点歌系统的教程
  13. at91sam9260 开发环境的建立
  14. Word 分节设置不同起始页码
  15. 通过PD4ML把html转pdf(包含显示页眉页脚,插入图片,显示页数)
  16. rn在java中什么意思,RN150中RN是什么意思
  17. 【QFD】质量保证需求
  18. 费雪MOGAFX方程式是什么?(三)
  19. c++的*号是否有空格的区别以及char*转std::vector<float>解析
  20. 微信登录异常errcode:40029

热门文章

  1. 【python常见面试题】之python 中对list去重的多种方法
  2. vue组件父子组件之间传递数据
  3. 【bzoj2186】[Sdoi2008]沙拉公主的困惑 欧拉函数
  4. Intel® Media Server Studio Support
  5. 几u产品结构计算机什么意思,计算机u系统组成.ppt
  6. php猴子找大王算法,php 正常的猴子选大王算法
  7. git restore用法
  8. python剑指offer替换空格_02_替换空格【python】
  9. 理解 Kotlin 中的属性(property)
  10. 令牌桶的自定义注解核心API演示