poj 1459 Power Network 网络流

来源:互联网 发布:淘宝苹果找回是真的吗 编辑:程序博客网 时间:2024/05/14 00:36
#include<stdio.h>#include<string.h>#include<queue>#include<vector>using namespace std;using namespace std;using namespace std;const int N=1024;const int inf=1<<24;struct Edge{    int from,to,cap,flow;};vector<Edge>edges;vector<int>G[N];int n,m,s,t;int vis[N];int d[N];int cur[N];void AddEdge(int from,int to,int cap){    Edge tp;    tp.from=from,tp.to=to,tp.cap=cap,tp.flow=0;    edges.push_back(tp);    tp.from=to,tp.to=from,tp.cap=0,tp.flow=0;    edges.push_back(tp);    int g_size=edges.size();    G[from].push_back(g_size-2);    G[to].push_back(g_size-1);}bool BFS(){    memset(vis,0,sizeof(vis));    queue<int>Q;    Q.push(s);    d[s]=0;    vis[s]=1;    while(!Q.empty())    {        int x=Q.front();        Q.pop();        for(int i=0; i<G[x].size(); i++)        {            Edge &e=edges[G[x][i]];            if(!vis[e.to]&&e.cap>e.flow)            {                vis[e.to]=1;                d[e.to]=d[x]+1;                Q.push(e.to);            }        }    }    return vis[t];}int DFS(int x,int a){    if(x==t||a==0) return a;    int flow=0,f;    for(int &i=cur[x]; i<G[x].size(); i++)    {        Edge &e=edges[G[x][i]];        if(d[x]+1==d[e.to]&&(f=DFS(e.to,min(a,e.cap-e.flow)))>0)        {            e.flow+=f;            edges[G[x][i]^1].flow-=f;            flow+=f;            a-=f;            if(a==0) break;        }    }    return flow;}int Maxflow(int st,int ed){    int flow=0;    while(BFS())    {        memset(cur,0,sizeof(cur));        flow+=DFS(st,inf);    }    return flow;}int main(){    int j,np,nc,u,v,z,use[1024];    char ss[1024];    while(~scanf("%d%d%d%d",&n,&np,&nc,&m))    {         edges.clear();        for(int i=0; i<N; i++)            G[i].clear();        s=n+2;        t=n+1;        memset(use,0,sizeof(use));        for(int i=0;i<m;i++)        {            u=0;v=0;z=0;            scanf("%s",ss);            for(j=1;ss[j]!=',';j++)                u=u*10+ss[j]-'0';            for(j++;ss[j]!=')';j++)                v=v*10+ss[j]-'0';            for(j++;ss[j]!=0;j++)                z=z*10+ss[j]-'0';            AddEdge(u,v,z);        }        for(int i=0;i<np;i++)        {            u=0;z=0;            scanf("%s",ss);            for(j=1;ss[j]!=')';j++)                u=u*10+ss[j]-'0';            for(j++;ss[j]!=0;j++)                z=z*10+ss[j]-'0';            AddEdge(s,u,z);        }        for(int i=0;i<nc;i++)        {            u=0;z=0;            scanf("%s",ss);            for(j=1;ss[j]!=')';j++)                u=u*10+ss[j]-'0';            for(j++;ss[j]!=0;j++)                z=z*10+ss[j]-'0';            AddEdge(u,t,z);        }        printf("%d\n",Maxflow(s,t));    }    return 0;}
0 0
原创粉丝点击