首页 > 代码库 > 全局最小割模板(定S,不定T,找最小割)

全局最小割模板(定S,不定T,找最小割)

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>using namespace std;const int MAXN=400;const int INF=0x7fffffff;int N,M,S;int a[MAXN][MAXN],dis[MAXN];bool visit[MAXN],d[MAXN];int StoerWagner(int N){    int p=N,ans=INF,Max,t,s,k,i;    memset(d,0,sizeof(d));    while (--p>0)    {        memset(visit,0,sizeof(visit));        memset(dis,0,sizeof(dis));        i=1;        while (d[i]) i++;        visit[i]=1;        for (int j=1;j<=N;j++)            if (!d[j] && !visit[j])                dis[j]=a[i][j];        t=s=i;        for (;i<=N;i++)        {            Max=0;            for (int j=1;j<=N;j++)                if (!d[j] && !visit[j] && Max<dis[j])                    Max=dis[k=j];            if (!Max) break;            visit[k]=1;            for (int j=1;j<=N;j++)                if (!d[j] && !visit[j])                    dis[j]+=a[k][j];            s=t;            t=k;        }        if (ans>dis[t]) ans=dis[t];        d[t]=1;        for (int j=1;j<=N;j++)            if (!d[j])            {                a[s][j]+=a[t][j];                a[j][s]+=a[j][t];            }    }    return ans;}int main(){    while (1)    {        scanf("%d%d%d",&N,&M,&S);        if (!N && !M && !S) break;///N 点数,M 边数,S起点        memset(a,0,sizeof(a));        for (int i=1;i<=M;i++)        {            int x,y,d;            scanf("%d%d%d",&x,&y,&d);            a[x][y]+=d;            a[y][x]+=d;        }        printf("%d\n",StoerWagner(N));    }    return 0;}

 

全局最小割模板(定S,不定T,找最小割)