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

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

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

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

BZOJ2229:

 #include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define mem(a,k) memset(a,k,sizeof(a))
#define rep(i,l,r) for (int i=l; i<=r; i++)
#define For(i,x) for (int i=h[x],k; i; i=e[i].nxt)
using namespace std; const int N=,inf=;
int m,n,u,v,w,x,S,T,TT,Q,tot,cnt,tmp[N],a[N],b[N],d[N],q[N*],h[N],ans[N][N];
struct E{ int to,nxt,v; }e[];
bool mark[N]; void add(int u,int v,int w){
e[++cnt]=(E){v,h[u],w}; h[u]=cnt;
e[++cnt]=(E){u,h[v],w}; h[v]=cnt;
} bool bfs(){
mem(d,); q[]=S; d[S]=;
for (int st=,ed=; st!=ed; ){
int x=q[++st];
For(i,x) if (e[i].v && !d[k=e[i].to])
d[k]=d[x]+,q[++ed]=k;
}
return d[T];
} int dfs(int x,int lim){
if (x==T) return lim;
int t,c=;
For(i,x) if (d[k=e[i].to]==d[x]+){
t=dfs(k,min(lim-c,e[i].v));
e[i].v-=t; e[i^].v+=t; c+=t;
if (c==lim) return lim;
}
if (!c) d[x]=-; return c;
} int dinic(){ int ans=; while(bfs()) ans+=dfs(S,inf); return ans; } void get(int x){
mark[x]=; For(i,x) if (!mark[k=e[i].to] && e[i].v) get(k);
} void solve(int l,int r){
if (l==r) return;
S=a[l]; T=a[r]; int t=dinic();
mem(mark,); get(S); int p=l,p0;
rep(i,,n) if (mark[i]) rep(j,,n) if (!mark[j]) ans[i][j]=ans[j][i]=min(ans[i][j],t);
for (int i=; i<=cnt; i+=) e[i].v=e[i^].v=(e[i].v+e[i^].v)>>;
rep(i,l,r) if (mark[a[i]]) tmp[p++]=a[i];
p0=p;
rep(i,l,r) if (!mark[a[i]]) tmp[p++]=a[i];
rep(i,l,r) a[i]=tmp[i];
solve(l,p0-); solve(p0,r);
} int main(){
freopen("bzoj2229.in","r",stdin);
freopen("bzoj2229.out","w",stdout);
for (scanf("%d",&TT); TT--; ){
cnt=; mem(h,); mem(ans,0x3f);
scanf("%d%d",&n,&m);
rep(i,,m) scanf("%d%d%d",&u,&v,&w),add(u,v,w);
rep(i,,n) a[i]=i; solve(,n);
for (scanf("%d",&Q); Q--; ){
scanf("%d",&x); tot=;
rep(i,,n-) rep(j,i+,n) if (ans[i][j]<=x) tot++;
printf("%d\n",tot);
}
puts("");
}
return ;
}

BZOJ4519:

 #include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define rep(i,l,r) for (int i=l; i<=r; i++)
#define For(i,x) for (int i=h[x],k; i; i=e[i].nxt)
using namespace std; const int N=,inf=;
int m,n,u,v,w,S,T,tot,cnt=,tmp[N],a[N],b[N],d[N],q[N],h[N];
struct E{ int to,nxt,v; }e[];
bool mark[N]; void add(int u,int v,int w){
e[++cnt]=(E){v,h[u],w}; h[u]=cnt;
e[++cnt]=(E){u,h[v],w}; h[v]=cnt;
} bool bfs(){
memset(d,,sizeof(d)); q[]=S; d[S]=;
for (int st=,ed=; st!=ed; ){
int x=q[++st];
For(i,x) if (e[i].v && !d[k=e[i].to])
d[k]=d[x]+,q[++ed]=k;
}
return d[T];
} int dfs(int x,int lim){
if (x==T) return lim;
int t,c=;
For(i,x) if (d[k=e[i].to]==d[x]+){
t=dfs(k,min(lim-c,e[i].v));
e[i].v-=t; e[i^].v+=t; c+=t;
if (c==lim) return lim;
}
if (!c) d[x]=-; return c;
} int dinic(){ int ans=; while(bfs()) ans+=dfs(S,inf); return ans; } void get(int x){
mark[x]=;
For(i,x) if (!mark[k=e[i].to] && e[i].v) get(k);
} void solve(int l,int r){
if (l==r) return;
S=a[l]; T=a[r]; b[++tot]=dinic();
memset(mark,,sizeof(mark));
get(S); int p=l,p0;
for (int i=; i<=cnt; i+=) e[i].v=e[i^].v=(e[i].v+e[i^].v)>>;
rep(i,l,r) if (mark[a[i]]) tmp[p++]=a[i];
p0=p;
rep(i,l,r) if (!mark[a[i]]) tmp[p++]=a[i];
rep(i,l,r) a[i]=tmp[i];
solve(l,p0-); solve(p0,r);
} int main(){
freopen("bzoj4519.in","r",stdin);
freopen("bzoj4519.out","w",stdout);
scanf("%d%d",&n,&m);
rep(i,,m) scanf("%d%d%d",&u,&v,&w),add(u,v,w);
rep(i,,n) a[i]=i;
solve(,n); sort(b+,b+tot+); tot=unique(b+,b+tot+)-b-;
printf("%d\n",tot);
return ;
}

最小割分治(最小割树):BZOJ2229 && BZOJ4519的更多相关文章

  1. bzoj2229: [Zjoi2011]最小割(分治最小割+最小割树思想)

    2229: [Zjoi2011]最小割 题目:传送门 题解: 一道非常好的题目啊!!! 蒟蒻的想法:暴力枚举点对跑最小割记录...绝对爆炸啊.... 开始怀疑是不是题目骗人...难道根本不用网络流?? ...

  2. 【bzoj4519】[Cqoi2016]不同的最小割 分治+最小割

    题目描述 学过图论的同学都知道最小割的概念:对于一个图,某个对图中结点的划分将图中所有结点分成两个部分,如果结点s,t不在同一个部分中,则称这个划分是关于s,t的割.对于带权图来说,将所有顶点处在不同 ...

  3. BZOJ 2229 / Luogu P3329 [ZJOI2011]最小割 (分治最小割板题)

    题面 求所有点对的最小割中<=c的数量 分析 分治最小割板题 首先,注意这样一个事实:如果(X,Y)是某个s1-t1最小割,(Z,W)是某个s2-t2最小割,那么X∩Z.X∩W.Y∩Z.Y∩W这 ...

  4. 【BZOJ-4519】不同的最小割 最小割树(分治+最小割)

    4519: [Cqoi2016]不同的最小割 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 393  Solved: 239[Submit][Stat ...

  5. 最小割树(Gomory-Hu Tree)求无向图最小割详解 附 BZOJ2229,BZOJ4519题解

    最小割树(Gomory-Hu Tree) 前置知识 Gomory-Hu Tree是用来解决无向图最小割的问题的,所以我们需要了解无向图最小割的定义 和有向图类似,无向图上两点(x,y)的割定义为一个边 ...

  6. [ZJOI2011]最小割 & [CQOI2016]不同的最小割 分治求最小割

    题面: [ZJOI2011]最小割 [CQOI2016]不同的最小割 题解: 其实这两道是同一道题.... 最小割是用的dinic,不同的最小割是用的isap 其实都是分治求最小割 简单讲讲思路吧 就 ...

  7. BZOJ 4435 [Cerc2015]Juice Junctions 分治最小割+hash

    分治最小割的题目,要求n2. 之前用的n3的方法自然不能用了. 于是用hash,设hash[i][j]表示在最小割为i的时候,j是否与S联通. 看懂这个需要理解一下最小割树的构造. 这种题建议用EK写 ...

  8. ZJOI 最小割 CQOI 不同的最小割 (最小割分治)

    题目1 ZJOI 最小割 题目大意: 求一个无向带权图两点间的最小割,询问小于等于c的点对有多少. 算法讨论: 最小割 分治 代码: #include <cstdlib> #include ...

  9. POJ3308 Paratroopers(最小割/二分图最小点权覆盖)

    把入侵者看作边,每一行每一列都是点,选取某一行某一列都有费用,这样问题就是选总权最小的点集覆盖所有边,就是最小点权覆盖. 此外,题目的总花费是所有费用的乘积,这时有个技巧,就是取对数,把乘法变为加法运 ...

随机推荐

  1. Codeforces Round #520 (Div. 2) B. Math

    B. Math time limit per test:1 second memory limit per test:256 megabytes Description: JATC's math te ...

  2. Django请求原理

    总结一下: 1. 进来的请求转入/hello/. 2. Django通过在ROOT_URLCONF配置来决定根URLconf. 3. Django在URLconf中的所有URL模式中,查找第一个匹配/ ...

  3. bzoj 5099 [POI2018]Pionek 计算几何 极角排序

    [POI2018]Pionek Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 269  Solved: 80[Submit][Status][Disc ...

  4. 自定义orderBy字母函数

    orderedUsers: function () { var arr = this.users; for (var i = 0; i < arr.length - 1; i++) { for ...

  5. eclipse调试java技巧

    详细内容请看: http://www.oschina.net/question/82993_69439

  6. JAVASCRIPT和JSP计算闰年

    0x01:JAVASCRIPT 实现 <h1 align="left">求闰年</h1> 开始年份: <input type="text&q ...

  7. saltstack入门至放弃之salt安装部署

    学习了一段时间的saltstack,是时候记录下了.友提:学习环境是两台centos_7.2_x64机器 系统初始化: 两台机器执行以下脚本即可(友提:两台服务器的主机名配置在/etc/hosts中, ...

  8. 【BZOJ】5010: [Fjoi2017]矩阵填数

    [算法]离散化+容斥原理 [题意]给定大矩阵,可以每格都可以任意填1~m,给定n个子矩阵,要求满足子矩阵内的最大值为vi,求方案数. n<=10,h,w<=1w. [题解] 此题重点之一在 ...

  9. bzoj 1022 SJ定理

    与传统的SG游戏不同的是,完成最后一个状态的人是输的,我们把这一类问题称作Anti-SG,这类问题的解决我们需要引入一个定理—SJ定理: 对于任意一个Anti-SG游戏,如果我们规定当局面中所有的单一 ...

  10. React第三次入门

    传统HTML开发在处理越来越多的服务器数据和用户交互数据反应到复杂界面的时候,代码量越来越大,难以维护. Angular是基于MVVM的开发框架,重量级..不适用于移动端的web栈, 其UI组件的封装 ...