题目链接:http://poj.org/problem?id=1459
题意:大意是在一个电力网中有n个节点,其中有np个发电站,nc个消耗点,剩下的为中转站,m条电缆。每条电缆都有传送电力的限制。
思路:多源多汇最大流问题。
思路参考了:http://blog.csdn.net/lyy289065406/article/details/6647060
#include <stdio.h>
#include <string.h>
#define min(x,y) ((x)<(y)?(x):(y))
const int INF=0x7fffffff;
int c[105][105],q[105],pre[105],inc[105];
int n,m,np,nc;
int s,t;
bool BFS (int s,int t)
{
int head,tail,i,u;
memset(pre,-1,sizeof(pre));
head=tail=0;
q[tail++]=s;
inc[s]=INF;
while (head<tail)
{
u=q[head++];
for (i=0;i<=t;i++)
if (pre[i]==-1 && c[u][i]>0)
{
inc[i]=min(inc[u],c[u][i]);
pre[i]=u;
if (i==t)
return true;
q[tail++]=i;
}
}
return false;
}
int Edmonds_Karp (int s,int t)
{
int maxflow,i;
memset(inc,0,sizeof(inc));
maxflow=0;
while (BFS(s,t))
{
maxflow+=inc[t];
for (i=t;i!=s;i=pre[i])
{
c[pre[i]][i]-=inc[t];
c[i][pre[i]]+=inc[t];
}
}
return maxflow;
}
int main()
{
while(scanf("%d%d%d%d",&n,&np,&nc,&m)!=EOF)
{
int i,u,v,w;
s=n;
t=n+1;
memset(c,0,sizeof(c));
for(i=1;i<=m;i++)
{
scanf(" (%d,%d)%d",&u,&v,&w);
c[u][v]=w;
}
for(i=1;i<=np;i++)
{
scanf(" (%d)%d",&u,&w);
c[s][u]=w;
}
for(i=1;i<=nc;i++)
{
scanf(" (%d)%d",&u,&w);
c[u][t]=w;
}
printf("%d\n",Edmonds_Karp(s,t));
}
return 0;
}