Hdu 3691 Nubulsa Expo(无向图最小割)

来源:互联网 发布:吃饭前拍照知乎 编辑:程序博客网 时间:2024/05/18 02:09
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=3691

思路:无向图最小割模板题。 流量最小且汇点自定,则可在最小割T集中任选一点当做汇点。

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#define debuusing namespace std;const int maxn=350;const int INF=0x3f3f3f3f;int e[maxn][maxn];int vis[maxn],v[maxn],dist[maxn];int SW(int n){    int i,j;    int res=INF;    for(int i=0; i<=n; i++) v[i]=i;    while(n>1)    {        int k=2,pre=1;        for(i=2; i<=n; i++)        {            dist[v[i]]=e[v[1]][v[i]];            if(dist[v[i]]>dist[v[k]]) k=i;        }        memset(vis,0,sizeof(vis));        for(i=2; i<=n; i++)        {            if(i==n)            {                res=min(res,dist[v[k]]);                for(j=1; j<=n; j++)                {                    e[v[pre]][v[j]]+=e[v[j]][v[k]];                    e[v[j]][v[pre]]+=e[v[j]][v[k]];                }                v[k]=v[n--];            }            vis[v[k]]=1;            pre=k;            k=-1;            for(j=2; j<=n; j++)                if(!vis[v[j]])                {                    dist[v[j]]+=e[v[pre]][v[j]];                    if(k==-1||dist[v[k]]<dist[v[j]]) k=j;                }        }    }    return res;}int main(){#ifdef debug    freopen("in.in","r",stdin);#endif // debug    int n,m,a,b,c,st;    while(scanf("%d%d%d",&n,&m,&st)==3&&(n+m+st))    {        memset(e,0,sizeof(e));        while(m--)        {            scanf("%d%d%d",&a,&b,&c);            e[a][b]+=c,e[b][a]+=c;        }        int ans=SW(n);        printf("%d\n",ans);    }    return 0;}


0 0