POJ_1273 Drainage Ditches (网络流)

  /*很裸的网络流题目,看了两天算导,今天终于A了一道网络流的题目。我的第一道网络流啊。。。^ ^

My Code:
*/

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>

using namespace std;

const int N = 210;
const int inf = 0x6fffffff;

bool vis[N];
int map[N][N];
int pre[N];
int n, m;

int augment() {
int v, i, f_min;
bool flag = false;

memset(pre, 0, sizeof(pre));
memset(vis, false, sizeof(vis));

deque<int> q;
q.push_back(1);
pre[1] = 0;
vis[1] = true;

while(!q.empty()) {
v = q.front();
q.pop_front();
for(i = 1; i <= m; i++) {
if(map[v][i] > 0 && !vis[i]) {
pre[i] = v;
vis[i] = true;
if(i == m) {
flag = true;
q.clear();
break;
}
else
q.push_back(i);
}
}
}
if(!flag) return 0;
v = m; f_min = inf;

while(pre[v]) {
f_min = map[pre[v]][v] < f_min ? map[pre[v]][v] : f_min;
v = pre[v];
}

v = m;
while(pre[v]) {
map[pre[v]][v] -= f_min;
map[v][pre[v]] += f_min;
v = pre[v];
}
return f_min;
}

int main() {
//freopen("data.in", "r", stdin);

int ans, a, b, c, aug;

while(~scanf("%d%d", &n, &m)) {
memset(map, 0, sizeof(map));
while(n--) {
scanf("%d%d%d", &a, &b, &c);
map[a][b] += c;
}
ans = 0; aug = augment();
while(aug) {
ans += aug;
aug = augment();
}
printf("%d\n", ans);
}
return 0;
}
posted @ 2011-11-12 10:36  AC_Von  阅读(168)  评论(0编辑  收藏  举报