定理: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. 一个JavaScript日期格式化扩展函数

    我们都知道在Java和PHP语言中,有专门用于格式化日期对象的类和函数,例如Java中的DateFormat等等,通过这些类和函数,我们可以方便的将一个日期对象按照格式的要求输出为字符串,例如对于同一 ...

  2. More on understanding sort_buffer_size

    There have been a few posts by Sheeri and Baron today on the MySQL sort_buffer_size variable. I want ...

  3. 链接oracle数据库 生成表对应的javabean

    package com.databi.utils; import java.io.File; import java.io.FileOutputStream; import java.io.IOExc ...

  4. 转:Mybatis系列之集合映射

    转:Mybatis系列之集合映射 上篇文章我们讲了关联映射,实现了销售与登录用户之间的关联.本文我们接着来讲一讲集合映射,实现销售与客户的多对多关系. 实现销售与客户多对多关系 本文中仍延用<M ...

  5. windows下mysql 5.7的配置全过程

    这是一套在好多次的安装下总结出来的经验,包括很多种遇到的问题,查过很多资料,特此总结一下. 一.从官网下载MySQL的zip(免安装的) 解压mysql-5.7.11-winx64.zip到自己指定的 ...

  6. 【poj1226-出现或反转后出现在每个串的最长公共子串】后缀数组

    题意:求n个串的最长公共子串,子串出现在一个串中可以是它的反转串出现.总长<=10^4. 题解: 对于每个串,把反转串也连进去.二分长度,分组,判断每个组. #include<cstdio ...

  7. 玩转Metasploit系列(第二集)

    在上一节的内容中,大家了解了Metasploit的结构.这一节我们主要介绍的是msfconsole的理论. msfconsole理论 在MSF里面msfconsole可以说是最流行的一个接口程序.很多 ...

  8. thinkphp 导入微信小程序加密解密库

    第三方类库 第三方类库指除了 ThinkPHP 框架.应用项目类库之外的其他类库,一般由第三方系统或产品提供,如 Smarty.Zend 等系统的类库等. 前面使用自动加载或 import 方法导入的 ...

  9. python进程池pool的starmap的使用

    #!/usr/bin/env python3 from functools import partial from itertools import repeat from multiprocessi ...

  10. 【bzoj3089】gty的二逼妹子序列

    一眼又是个莫队-- 首先看这时间/空间复杂度,线段树/主席树就别想了-- 然后么--zcy就有点傻了-- 于是zcy看了下hzwer,感觉受教育了. 分块的调块大小真是玄学设计. 有没有一种方法在修改 ...