POJ1273 Drainage Ditches (网络流)

比较简单的网络流。

需要注意的地方:

1、数据中有重边;

2、输入均为单向边。

View Code
#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;
#define MIN(a,b) ((a)<(b)?(a):(b))
#define N 201
#define INF 0x3ffffff
int n,m;
int g[N][N];
int pre[N];
void EK(int s,int t)
{
    int maxflow=0;
    int u,v;
    while(true)
    {
        queue<int>q;
        memset(pre,-1,sizeof(pre));
        q.push(s);
        while(!q.empty())
        {
            u=q.front(),q.pop();
            for(v=1;v<=n;v++)   if(g[u][v] && pre[v]==-1)
            {
                pre[v]=u;
                q.push(v);
            }
            if(pre[t]!=-1)  break;
        }
        if(pre[t]==-1)  break;
        int aug=INF;
        for(v=t,u=pre[t];v!=s;v=u,u=pre[u])
        {
            aug=MIN(aug,g[u][v]);
        }
        for(v=t,u=pre[t];v!=s;v=u,u=pre[u])
        {
            g[u][v]-=aug;
            g[v][u]+=aug;
        }
        maxflow+=aug;
    }
    printf("%d\n",maxflow);
}
int main()
{
    int u,v,w;
    while(~scanf("%d%d",&m,&n))
    {
        for(int i=1;i<=n;i++)   memset(g[i],0,sizeof(int)*(n+1));
        while(m--)
        {
            scanf("%d%d%d",&u,&v,&w);
            g[u][v]+=w;
        }
        EK(1,n);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/algorithms/p/2612194.html