poj 1273 Drainage Ditches(最大流)

来源:互联网 发布:黑白点网络 编辑:程序博客网 时间:2024/05/19 16:29


题意: Farmer John于是做了若干排水沟,每条沟在起始处安置一个阀门来控制这条沟的最大排水量,现在给出沟的条数以及阀门的个数。并给出每条沟的最大排水量。 Farmer John's田里的积水处是阀门1,排出水的位置是最后一个阀门。求约翰在处理积水时的最大排出量。


题目链接:http://poj.org/problem?id=1273


思路:源点到汇点的最大流量,直接模板~~~~

不过小小的trick~~~因为重边,流量的累加~~~

不过,E-K 算法的时间复杂度为 O(VE2),由于 BFS 要搜索全部小于最短距离的分支路径之后才能找到终点,因此可以想象频繁的 BFS 效率是比较低的,

改进的算法 Dinic算法 &&  SAP 算法 ,on the way!!


 #include <iostream> #include <queue> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <algorithm> using namespace std; #define maxn 210 #define inf 0x3f3f3f3f int n,m,f=0; int a[maxn]; int p[maxn]={0}; int cap[maxn][maxn]; int flow[maxn][maxn]; int main() {     int x,y,c;     while(~scanf("%d %d",&n,&m)){        memset(cap,0,sizeof(cap));        memset(flow,0,sizeof(flow));        while(n--){            scanf("%d %d %d",&x,&y,&c);            cap[x][y] += c;        }        int s = 1, t = m;        queue<int> q;        f = 0;        for(;;){            memset(a,0,sizeof(a));            a[s] = inf;            q.push(s);            while(!q.empty()){                int u = q.front(); q.pop();                for(int v = 1;v <= t;v ++)                if(!a[v] && cap[u][v] > flow[u][v]){                    p[v]=u;q.push(v);                    a[v]=min(a[u],(cap[u][v]-flow[u][v]));                }            }            if(a[t] == 0) break;            for(int u = t;u != s;u = p[u]){                flow[p[u]][u] += a[t];                flow[u][p[u]] -= a[t];            }            f += a[t];        }        printf("%d\n",f);     }     return 0; }