poj 2135

#include<iostream>
#include<fstream>
#include<queue>

using namespace std;

struct e{
    int data;
    int c,f;
    int w;
    e *next;
    e *opt;
};

e edge[1010];
int total;
int n,m;

void add(int s,int t,int h,int w){
    e *p=new e;
    p->data=t;
    p->c=h;
    p->f=0;
    p->w=w;
    p->next=edge[s].next;
    edge[s].next=p;

    e *q=new e;
    q->data=s;
    q->c=q->f=0;
    q->w=-w;
    q->next=edge[t].next;
    edge[t].next=q;
    p->opt=q;
    q->opt=p;
}

int d[1010],v[1010];

int path[1010];
e *pa[1010];

int spfa(){
    int i,j,k;
    for(i=0;i<=total;i++)
        d[i]=100000000;
    d[0]=0;

    queue<int> q;
    q.push(0);
    v[0]=1;
    path[0]=-1;
   
    while(!q.empty())
    {
        i=q.front();
        q.pop();
        v[i]=0;
        e *p=edge[i].next;
        while(p)
        {
            if(d[p->data]>d[i]+p->w&&p->c>p->f)
            {
                d[p->data]=d[i]+p->w;
                path[p->data]=i;
                pa[p->data]=p;
                if(v[p->data]==0)
                {
                    q.push(p->data);
                }
            }

            p=p->next;
        }
    }
    if(d[total]==100000000) return 0;
    return 1;
}




void solve(){
    int i,j,k;
    int flow=0,weight=0;
    while(spfa())
    {
        j=total;
        k=1000000;
        while(path[j]!=-1)
        {
            k=min(pa[j]->c-pa[j]->f,k);
            j=path[j];
        }
        j=total;
        while(path[j]!=-1)
        {
            pa[j]->f+=k;
            pa[j]->opt->f=-1*pa[j]->f;
            j=path[j];
        }
        weight+=d[total];

    }
    cout<<weight<<endl;
}

void read(){
//    ifstream cin("in.txt");
    int i,j,k,s,t,w;
    cin>>n>>m;
    total=n+1;
    add(0,1,2,0);
    add(n,total,2,0);
    for(i=1;i<=m;i++)
    {
        cin>>s>>t>>w;
        add(s,t,1,w);
        add(t,s,1,w);
    }
    solve();
}

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

posted on 2011-05-31 10:29  宇宙吾心  阅读(238)  评论(0)    收藏  举报

导航