您的位置:首页 > 其它

poj1273-----最大流基础(最简单的最大流!--模板题)

2012-10-15 20:43 766 查看
题意:下雨的时候约翰的田里总是积水,积水把他种的三叶草给淹了,他于是做了若干排水沟,每条沟在起始处安置一个阀门来控制这条沟的最大排水量,现在给出沟的条数以及阀门的个数。并给出每条沟的最大排水量。约翰的田里的积水处是阀门1,排出水的位置是最后一个阀门。求约翰在处理积水时的最大排出量。

#include<cstdlib>
#include<iostream>
#include<sstream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include <algorithm>
#include<vector>
#include<set>
#include<queue>
#define LL long long
#define inf 0x7f7f7f7f
#define E 1e-9
#define N 205
#define M 2000000
using namespace std;
int flow

,cap

;
int d
,fa
;
int n,m;
void dfs(int s,int t)
{
  memset(d,0,sizeof(d));
  queue<int> q;
  q.push(s);
  d[s]=inf;
  while(!q.empty())
    {
      int u=q.front();
      q.pop();
      for(int i=1; i<=m; i++) //m是结点个数!
        if(!d[i]&&cap[u][i]>flow[u][i])
          {
            d[i]=min(d[u],cap[u][i]-flow[u][i]);
            q.push(i);
            fa[i]=u;
            if(i==t)
            {
                while(!q.empty())q.pop();
                return ;
            }
          }
    }
}
int getflow(int s,int t)
{
  memset(flow,0,sizeof(flow));
  int f=0;
  while(1)
    {
      dfs(s,t);
      if(!d[t])
        break;
      f+=d[t];
      for(int p=t; p!=s; p=fa[p])//更新流量
        {
          flow[fa[p]][p]+=d[t];
          flow[p][fa[p]]-=d[t];
        }
    }
  return f;
}
int main()
{
#ifndef ONLINE_JUDGE
  freopen("ex.in","r",stdin);
#endif
  while(scanf("%d%d",&n,&m)!=EOF)
    {
      memset(cap,0,sizeof(cap));//初始化很重要
      int a,b,c;
      for (int i=0; i<n; i++)
        {
          scanf("%d%d%d",&a,&b,&c);
          cap[a][b]+=c;
        }
      printf("%d\n",getflow(1,m));
    }

  return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: