zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    二分 || UOJ 148 跳石头
    等边n边型
    激光样式
    n个数中选k个数和为sum
    引爆炸弹
    光盘行动
    (二分)分蛋糕问题
    总结
    个人测试
    第三次团队作业
  • 原文地址:https://www.cnblogs.com/algorithms/p/2612194.html
Copyright © 2011-2022 走看看