Drainage Ditches(HD1532)

原体链接:http://acm.hdu.edu.cn/showproblem.php?pid=1532

代码:

#include<iostream>
#include<memory.h>
#include<queue>
using namespace std;
int min(int a,int b)
{
  return a<b?a:b;
}
int getMax(int c[201][201],int nodenum)
{
  int flow[201][201],max=0;//记录每条路的实际运输量
  int a[201],pre[201];//min记录到达此点的最小运输量,pre记录此点的先趋
  memset(flow,0,sizeof(flow));
  queue<int> q;
  while(1)
  {
      memset(a,0,sizeof(a));
    a[1]=100000001;
    q.push(1);
    //while循环找一条路中的最小运输量
    while(!q.empty())
    {
      int u=q.front();
      q.pop();
      for(int v=1;v<=nodenum;v++)
      {
         if(!a[v]&&c[u][v]>flow[u][v])//如果该点没有被标记,并且该条路还可以增流
          {
             q.push(v);
             pre[v]=u;
             a[v]=min(a[u],c[u][v]-flow[u][v]);
          }
      }
    }
     if(a[nodenum]==0)
      break;
     for(int u=nodenum;u!=1;u=pre[u])
     {
       flow[pre[u]][u]+=a[nodenum];
       flow[u][pre[u]]-=a[nodenum];
     }
    max+=a[nodenum];
  }
return max;
}
int main()
{
 int N,M,can[201][201],a,b,c,max;

while(cin>>N>>M)
{
memset(can,0,sizeof(can));
 for(int i=1;i<=N;i++)
 {
   cin>>a>>b>>c;
   can[a][b]+=c;
 }
 max=getMax(can,M);
 cout<<max<<endl;
}
}

 

 

posted @ 2013-05-28 19:59  supersnow0622  Views(131)  Comments(0)    收藏  举报