标签:for void cpp lang code 之间 端点 nic uil
通过建最小割树 \((Gomory-Hu\ Tree)\) 来快速求解无向图中两点间的最小割。
最小割树中的一条边的权值,为其两端点的最小割,那么任意两点之间的最小割即为路径上的最小值。
通过递归建树即可。
\(code:\)
void build(int l,int r)
{
if(l==r) return;
s=p[l],t=p[l+1];
int v=F.dinic(),cnt1=0,cnt2=0;
add(s,t,v),add(t,s,v);
for(int i=l;i<=r;++i)
{
int x=p[i];
if(F.d[x]) p1[++cnt1]=x;
else p2[++cnt2]=x;
}
for(int i=1;i<=cnt1;++i) p[l+i-1]=p1[i];
for(int i=1;i<=cnt2;++i) p[l+cnt1+i-1]=p2[i];
build(l,l+cnt1-1),build(l+cnt1,r);
}
标签:for void cpp lang code 之间 端点 nic uil
原文地址:https://www.cnblogs.com/lhm-/p/13269590.html