POJ 1459 Power Network
有多个发电站 中转站 和用户 多源 多汇的最大流问题
建立源点 和 汇点 将发电站连到源点上将用户连到汇点上 求图的最大流
#include<iostream>
#include<queue>
#include<stdio.h>
#include<cstring>
using namespace std;
#define INF 0x7fffffff
int cap[503][503],a[503],p[503];
int ek(int s,int t,int n)
{
int f=0;
while(1)
{
queue<int> q;
memset(a,0,sizeof(a));
a[s]=INF;
q.push(s);
while(!q.empty())
{
int u=q.front();
q.pop();
for(int v=0;v<=n;v++)
if(!a[v]&&cap[u][v])
{
p[v]=u;
q.push(v);
a[v]=a[u]<cap[u][v]?a[u]:cap[u][v];
}
}
if(a[t]==0)
break;
for(int u=t;u!=s;u=p[u])
{
cap[p[u]][u]-=a[t];
cap[u][p[u]]+=a[t];
}
f+=a[t];
}
return f;
}
int main()
{
int n,np,nc,m;
while(cin>>n)
{
int u,v,z;
char str[11];
cin>>np>>nc>>m;
memset(cap,0,sizeof(cap));
for(int i=1;i<=m;i++)
{
scanf("%s",str);
sscanf(str,"(%d,%d)%d",&u,&v,&z);
cap[u][v]=z;
}
for(int i=1;i<=np;i++)
{
scanf("%s",str);
sscanf(str,"(%d)%d",&u,&z);
cap[n][u]=z;
}
for(int i=1;i<=nc;i++)
{
scanf("%s",str);
sscanf(str,"(%d)%d",&u,&z);
cap[u][n+1]=z;
}
int s=n,t=n+1;
cout<<ek(s,t,n+1)<<endl;
}
return 0;
}

浙公网安备 33010602011771号