题意: 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;
}