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

USACO Section 4.2: Drainage Ditches

2013-07-24 20:16 246 查看
最大流的模板题

/*
ID: yingzho1
LANG: C++
TASK: ditch
*/
#include <iostream>
#include <fstream>
#include <string>
#include <map>
#include <vector>
#include <set>
#include <algorithm>
#include <stdio.h>
#include <queue>
#include <cstring>
#include <cmath>
#include <list>
#include <cstdio>
#include <cstdlib>
#include <limits>
#include <stack>

using namespace std;

ifstream fin("ditch.in");
ofstream fout("ditch.out");

const int MAX = 210;
const int INF = 2000000000;

int N, M;
int g[MAX][MAX], f[MAX][MAX], pre[MAX], inc[MAX];

bool bfs(int s, int d) {
queue<int> que;
for (int i = 1; i <= M; i++) pre[i] = -1;
que.push(s);
inc[s] = INF;
while (!que.empty()) {
int u = que.front();
que.pop();
for (int i = 1; i <= M; i++) {
if (pre[i] == -1 && f[u][i] < g[u][i]) {
inc[i] = min(inc[u], g[u][i]-f[u][i]);
pre[i] = u;
if (i == d) return true;
que.push(i);
}
}
}
return false;
}

int edmond_karp(int s, int d) {
int maxflow = 0;
while (bfs(s, d)) {
maxflow += inc[d];
for (int i = d; i != s; i = pre[i]) {
f[pre[i]][i] += inc[d];
f[i][pre[i]] -= inc[d];
}
}
return maxflow;
}

int main()
{
fin >> N >> M;
int s, d, e;
for (int i = 0; i < N; i++) {
fin >> s >> d >> e;
g[s][d] += e;
}
fout << edmond_karp(1, M) << endl;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: