您的位置:首页 > 大数据 > 人工智能

POJ 1273 Drainage Ditches(最大流入门题)

2013-05-02 15:35 183 查看
里面可能有重边 可以把重边全部加在一起就可以了,用的是EK算法.

#include <iostream>
#include <cstdio>
#include <memory.h>
#include <queue>
using namespace std;
#define INF 0X50505050
const int maxn = 205;

int g[maxn][maxn], fa[maxn], n, m;
bool vis[maxn];
bool bfs(){
memset(fa, -1, sizeof(fa));
queue<int> q;
q.push(1);
while (q.size()){
int t = q.front(); q.pop();
if(t == m)return true;
for (int i = 1; i <= m; ++i){
if(g[t][i] && fa[i] < 0){
fa[i] = t;
q.push(i);
}
}
}
return false;
}
int Emond_karps(){
int ans = 0;
while (bfs()){
int minF=INF;
for (int i = m; i != 1; i = fa[i]){
if(g[fa[i]][i] < minF){
minF = g[fa[i]][i];
}
}
if(minF == INF) break;
for (int i = m; i != 1; i = fa[i]){
g[fa[i]][i] -= minF;
g[i][fa[i]] += minF;
}
ans += minF;
}
return ans;
}
int main(){
while (scanf("%d%d", &n, &m) == 2){
memset(g,0,sizeof(g));
for (int i = 0;i < n ; ++i){
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
g[u][v] += w;
}
printf("%d\n", Emond_karps());
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: