P4897 【模板】最小割树(Gomory-Hu Tree)
这个算法可以用来求解一个无向图上任意两点的最小割,具体过程就是每次选择两个点求最小割,然后在一个新图中这两个点连边,然后对于这两个点的连通块分别递归处理,可以发现这样得到的一定是一个树,然后两个点的最小割等于这两个点在树链上的边权最小值,可以倍增求解。
具体证明:
https://www.cnblogs.com/birchtree/p/10761585.html
代码细节:
记得无向图网络流建边要双向连,所以一共需要条边,另外还要注意每一次重新求解要将流量数组还原,这里的最小割依然是整张图上的,不是递归范围的。
#include<bits/stdc++.h>
#define LL long long
#define V inline void
#define I inline int
#define FOR(i,a,b) for(register int i=a,end##i=b;i<=end##i;++i)
#define REP(i,a,b) for(register int i=a,end##i=b;i>=end##i;--i)
using namespace std;
inline int read()
{
char x='\0';
int fh=1,sum=0;
for(x=getchar();x<'0'||x>'9';x=getchar())if(x=='-')fh=-1;
for(;x>='0'&&x<='9';x=getchar())sum=sum*10+x-'0';
return fh*sum;
}
const int N=2009,M=4009,INF=0x3f3f3f3f;
int n,m,q;
namespace netflow{
struct lian{
int to,pre,cap;
}e[M<<1];
int hed[N],lcnt=1;
V jlian(int x,int y,int cap)
{
e[++lcnt]={
y,hed[x],cap};
hed[x]=lcnt;
e[++lcnt]={
x,hed[y],0};
hed[y]=lcnt;
}
int cur[N],dep[N];
queue<int>q;
I bfs(int S,int T)
{
memcpy(cur,hed,sizeof(hed));
memset(dep,0,sizeof(dep));
dep[S]=1

最低0.47元/天 解锁文章
1814

被折叠的 条评论
为什么被折叠?



