【网络流】hdu3549 Flow Problem

来源:互联网 发布:网络侵权著作权案例 编辑:程序博客网 时间:2024/04/28 19:56
题意:求最大流。
难度:1
题解:略。
#include<cstdio>#include<cstring>#include<queue>#include<iostream>using namespace std;const int mxn=110;const int mxf=0x7fffffff;int n,np,nc,m;int resi[mxn][mxn],ef[mxn],h[mxn],s,t,V;queue<int> Q;void push_relable(){    int i,j,sum=0,u,v,p;    for(i=1;i<=V;i++)        h[i]=ef[i]=0;    h[s]=V;ef[s]=mxf;ef[t]=-mxf;    Q.push(s);    while(!Q.empty())    {        u=Q.front();Q.pop();        for(v=1;v<=V;v++)        {            p=(resi[u][v]<ef[u])?resi[u][v]:ef[u];            if(p>0 && (u==s || h[u]==h[v]+1))            {                resi[u][v]-=p;resi[v][u]+=p;                ef[u]-=p;ef[v]+=p;                if(v==t) sum+=p;                if(v!=s && v!=t) Q.push(v);            }        }        if(u!=s && u!=t && ef[u]>0)        {            h[u]++;Q.push(u);        }    }    printf("%d\n",sum);}int main() {    int T,cas=1;    scanf("%d",&T);    while(T--) {        scanf("%d%d",&n,&m);        s=1,t=n,V=n;        printf("Case %d: ",cas++);        memset(resi,0,sizeof(resi));        while(m--) {            int u,v,val;            scanf("%d%d%d",&u,&v,&val);            resi[u][v] += val;            }                push_relable();    }       return 0;    }


0 0