这个好像跟EK算法的本质差不多,不过一个dfs,一个bfs,总体看来一般用bfs会好一点。

程序:

#include<iostream>
#include<cstdio>
#include<vector> 
#include<cstring> 
using namespace std;
struct edge{
  int from,to,cap,flow,nod;
};
vector<edge>g[20000];
int s,t;
bool vis[20000];
void add(int u,int v,int w)
{
  g[u].push_back((edge){u,v,w,0,g[v].size()});
  g[v].push_back((edge){v,u,0,0,g[u].size()-1});
}
int dfs(int now,int maxx)
{
  if (now==t) return maxx;
  vis[now]=true;
  for (int i=0;i<g[now].size();i++)
  {
      edge e=g[now][i];
      if ((!vis[e.to])&&(e.cap>e.flow))
      {
         int d=dfs(e.to,min(maxx,e.cap-e.flow));
         if (d>0)
         {
           e.flow+=d;
           g[now][i]=e;
           g[e.to][e.nod].flow-=d;
         return d;    
       }
    }
  }
  return 0;
}
int main()
{
  int m,a,b,c,n;
  scanf("%d%d%d%d",&n,&m,&s,&t);
  for (int i=1;i<=m;i++)
  {
      scanf("%d%d%d",&a,&b,&c);
      add(a,b,c);
  }
  int ans=0;
  for (;;)
  {
      memset(vis,0,sizeof vis);
      int sum=dfs(s,210000000);
      if (sum==0) break;
      ans+=sum;
  }
  printf("%d\n",ans);
  return 0;
}

 

posted on 2017-03-27 15:13  nhc2014  阅读(263)  评论(0编辑  收藏  举报