5 4 1 2 40 1 4 20 2 4 20 2 3 30 3 4 10
50
AC代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>
#define LL long long
#define INF 0x7fffffff
using namespace std;
const int maxn = 205;
int n, m;
int cap[maxn][maxn];
int flow[maxn];
int pre[maxn];
int bfs(int s, int t) {
memset(pre, -1, sizeof(pre));
pre[s] = 0;
flow[s] = INF;
queue<int> que;
que.push(s);
while(!que.empty()) {
int cur = que.front();
que.pop();
if(cur == t) break; //找到增广路径
for(int i = 1; i <= m; i++) {
if(i != s && cap[cur][i] > 0 && pre[i] == -1) {
pre[i] = cur; //记录前驱
flow[i] = min(cap[cur][i], flow[cur]);
que.push(i);
}
}
}
if(pre[t] == -1) return -1;
else return flow[t];
}
int ek(int s, int t) {
int inc = 0;
int ans = 0;
while((inc = bfs(s, t)) != -1) {
int k = t;
while(k != s) {
cap[pre[k]][k] -= inc;
cap[k][pre[k]] += inc;
k = pre[k];
}
ans += inc;
}
return ans;
}
int main() {
while(cin >> n >> m) {
memset(cap, 0, sizeof(cap));
for(int i = 0; i < n; i++) {
int u, v, w;
scanf("%d %d %d", &u, &v, &w);
if(u == v) continue;
cap[u][v] += w;
}
cout << ek(1, m) << endl;
}
return 0;
}
2 3 2 1 2 1 2 3 1 3 3 1 2 1 2 3 1 1 3 1
Case 1: 1 Case 2: 2
AC代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>
#define LL long long
#define INF 0x7fffffff
using namespace std;
const int maxn = 205;
int n, m;
int cap[maxn][maxn];
int flow[maxn];
int pre[maxn];
int bfs(int s, int t) {
memset(pre, -1, sizeof(pre));
pre[s] = 0;
flow[s] = INF;
queue<int> que;
que.push(s);
while(!que.empty()) {
int cur = que.front();
que.pop();
if(cur == t) break; //找到增广路径
for(int i = 1; i <= m; i++) {
if(i != s && cap[cur][i] > 0 && pre[i] == -1) {
pre[i] = cur; //记录前驱
flow[i] = min(cap[cur][i], flow[cur]);
que.push(i);
}
}
}
if(pre[t] == -1) return -1;
else return flow[t];
}
int ek(int s, int t) {
int inc = 0;
int ans = 0;
while((inc = bfs(s, t)) != -1) {
int k = t;
while(k != s) {
cap[pre[k]][k] -= inc;
cap[k][pre[k]] += inc;
k = pre[k];
}
ans += inc;
}
return ans;
}
int main() {
int T;
scanf("%d", &T);
for(int cas = 1; cas <= T; cas++) {
cin >> m >> n;
memset(cap, 0, sizeof(cap));
for(int i = 0; i < n; i++) {
int u, v, w;
scanf("%d %d %d", &u, &v, &w);
if(u == v) continue;
cap[u][v] += w;
}
cout << "Case " << cas << ": " << ek(1, m) << endl;
}
return 0;
}
HDU - 1532 - Drainage Ditches && 3549 - Flow Problem (网络流初步)
原文地址:http://blog.csdn.net/u014355480/article/details/45103877