0
点赞
收藏
分享

微信扫一扫

POJ1273 最大流模板题_Edmonds_Karp


 赤果果的网络流...模板题...唯一要留意的是一条边可能会给出多次容量..所以每次都要加起来才是这条边的流量...用Edmonds_Karp写的:

/*
POJ1273 最大流模板题. Edmonds_Karp
*/
#include<iostream>
#include<queue>
using namespace std;
queue<int> Myqueue;
int NumOfPoint,NumOfLine,Network[210][210],pre[210];
int GetMin(int a,int b)
{
if (a<b) return a; else return b;
}
int BFS()
{
bool used[210];
int i,NowPoint,Flow[210];
memset(Flow,-1,sizeof(Flow));
memset(used,0,sizeof(used));
while (!Myqueue.empty()) Myqueue.pop();
Myqueue.push(1); Flow[1]=1<<30; pre[1]=1;
while (!Myqueue.empty())
{
NowPoint=Myqueue.front();
Myqueue.pop();
for (i=1;i<=NumOfPoint;i++)
if ( !used[i] && Network[NowPoint][i] ) // 每次广搜..每个点只use一次..!
{
Flow[i]=GetMin ( Flow[NowPoint] , Network[NowPoint][i] );
used[i]=true;
pre[i]=NowPoint;
Myqueue.push(i);
}
}
if (Flow[NumOfPoint]==-1) return 0;
return Flow[NumOfPoint];
}
int Edmonds_Karp()
{
int i,MinFlow,ans=0;
while (MinFlow=BFS())
{
ans+=MinFlow;
int NowPoint=NumOfPoint,PrePoint;
while (NowPoint!=1)
{
PrePoint=pre[NowPoint];
Network[PrePoint][NowPoint]-=MinFlow;
Network[NowPoint][PrePoint]+=MinFlow;
NowPoint=PrePoint;
}
}
return ans;
}
int main()
{
freopen("1458.in","r",stdin);
freopen("1458.out","w",stdout);
while (scanf("%d%d",&NumOfLine,&NumOfPoint)!=EOF)
{
int x,y,R;
memset(Network,0,sizeof(Network));
for (int i=1;i<=NumOfLine;i++)
{
scanf("%d%d",&x,&y);
scanf("%d",&R);
Network[x][y]+=R;
}
printf("%d\n",Edmonds_Karp());
}
return 0;
}



 

举报

相关推荐

0 条评论