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;   
}


 

你可能感兴趣的:(网络,NetWork)