poj 2914

最小割

代码:

#include<iostream>
#include<fstream>

using namespace std;

int n,m;

int map[501][501];
int v[501],com[501],w[501];
int cost;
int S,T;

void search(){
    int i,j,k;
    int maxx;
    memset(v,0,sizeof(v));
    memset(w,0,sizeof(w));
    S=T=-1;

    while(1)
    {
        maxx=-1;k=-1;
        for(i=0;i<n;i++)
            if(!com[i]&&!v[i]&&w[i]>maxx)
            {
                maxx=w[i];
                k=i;
            }
        if(k==-1) return;
        v[k]=1;
        cost=w[k];
        S=T;T=k;
        for(i=0;i<n;i++)
            if(!v[i]&&!com[i])
                w[i]+=map[k][i];
    }
}
   


void solve(){
    int i,j,k;
    int ans=100000000;
    memset(com,0,sizeof(com));

    for(i=1;i<n;i++)
    {
        search();
        if(cost<ans) ans=cost;
        com[T]=1;
        for(j=0;j<n;j++)
            if(!com[j])
            {
                map[S][j]+=map[T][j];
                map[j][S]+=map[j][T];
            }
    }
    cout<<ans<<endl;
}

void read(){
//    ifstream cin("in.txt");
    int i,j,k,s,t;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        memset(map,0,sizeof(map));
        for(i=1;i<=m;i++)
        {
//            cin>>s>>t>>k;
            scanf("%d%d%d",&s,&t,&k);
            map[s][t]+=k;
            map[t][s]+=k;
        }
        solve();

    }
}

int main(){
    read();
    return 0;
}

posted on 2011-05-26 10:19  宇宙吾心  阅读(411)  评论(0)    收藏  举报

导航