Power Network--POJ 1459

1、题目类型:图论、最大流、Edmonds_Karp算法。

2、解题思路:简单最大流问题,Edmonds_Karp算法的经典应用。

3、注意事项:对比Ford_Fulkerson算法DFS寻找增广路径,Edmonds_Karp算法BFS寻找增广路径效率更高。

4、实现方法:

#include<iostream>
#include
<cmath>
#include
<queue>
using namespace std;
#define Max 110
#define INF 99999999

int n,np,nc,m,s,t;
int map[Max][Max],tmp[Max],pre[Max];

void Init()
{
int i,u,v,z;
char ch;
memset(map,
0,sizeof(map));
cin
>>np>>nc>>m;
for(i=0;i<m;i++)
{
cin
>>ch>>u>>ch>>v>>ch>>z;
map[u
+1][v+1]=z;
}
for(i=0;i<np;i++)
{
cin
>>ch>>u>>ch>>z;
map[
0][u+1]=z;
}
for(i=0;i<nc;i++)
{
cin
>>ch>>u>>ch>>z;
map[u
+1][n+1]=z;
}
}
int BFS()
{
int i,k;
queue
<int> Q;
memset(tmp,
0,sizeof(tmp));
memset(pre,
0,sizeof(pre));
tmp[s]
=INF;
Q.push(s);
while(!Q.empty())
{
k
=Q.front();
Q.pop();
for(i=0;i<=t;i++)
{
if(tmp[i]==0 && map[k][i])
{
tmp[i]
=tmp[k]>map[k][i]?map[k][i]:tmp[k];
pre[i]
=k;
Q.push(i);
}
}
}
if(tmp[t]==0)
return -1;
return 1;
}

void Edmonds_Karp()
{
int i,ans=0;
s
=0,t=n+1;
while(BFS() != -1)
{
ans
+=tmp[t];
for(i=t;i!=s;i=pre[i])
{
map[pre[i]][i]
-=tmp[t];
map[i][pre[i]]
+=tmp[t];
}
}
cout
<<ans<<endl;
}
int main()
{
while(cin>>n)
{
Init();
Edmonds_Karp();
}
return 1;
}

 

posted @ 2010-08-13 15:25  勇泽  阅读(287)  评论(0编辑  收藏  举报