poj 1459 Power Network

#include<iostream>            //多源多汇网络流,参考poj8 1273 Drainage Ditches
#include<queue>
using namespace std;
#define inf 0x7fffffff
int flow[102][102],cap[102][102],a[102],p[102],s,t,f;
int n,np,nc,m,u,v,z;
void ek()
{
queue
<int> col;
memset(flow,
0,sizeof(flow));
f
=0;
while(1)
{
memset(a,
0,sizeof(a));
a[s]
=inf;
col.push(s);
while(!col.empty())
{
int u=col.front();col.pop();
for(int i=0;i<=n+1;++i) //与poj8 1273 不同,注意i的变化范围
if(!a[i]&&cap[u][i]>flow[u][i])
{
a[i]
=min(a[u],cap[u][i]-flow[u][i]);
p[i]
=u;
col.push(i);
}
}
if(a[t]==0)
break;
for(int i=t;i!=s;i=p[i])
flow[p[i]][i]
+=a[t],flow[i][p[i]]-=a[t];
f
+=a[t];
}
cout
<<f<<endl;
}
int main()
{
while(scanf("%d%d%d%d",&n,&np,&nc,&m)!=EOF)
{
s
=0;t=n+1; //超级源点,汇点
memset(cap,0,sizeof(cap));
while(m--)
{
scanf(
" (%d,%d)%d",&u,&v,&z);
cap[u
+1][v+1]+=z; //初始时结点的下标从0到n-1,+1后从1到n,添加超级源点,汇点后从0到n+1
}
while(np--)
{
scanf(
" (%d)%d",&u,&z);
cap[s][u
+1]=z;
}
while(nc--)
{
scanf(
" (%d)%d",&u,&z); //这里不能是scanf(" (%d)%d ",&u,&z);
cap[u+1][t]=z;
}
ek();
}
return 0;
}
//在图中添加1个源点s和汇点t,将s和每个发电站(类型为p的结点)相连,边的权值是发电站能提供的最大流量;
//将每个用户和t相连,边的权值是每个用户(类型为c的结点)能接受的最大流量。从而转化成了一般的最大网络流问题,然后求解。

  

posted on 2011-07-22 20:23  sysu_mjc  阅读(118)  评论(0编辑  收藏  举报

导航