码迷,mamicode.com
首页 > 其他好文 > 详细

最小割树

时间:2020-07-08 23:07:25      阅读:69      评论:0      收藏:0      [点我收藏+]

标签: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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!