Ford-Fulkerson方法入门。
有多个输入,因为这个WA了好多次。
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std;
const int MAX_N_M = 205;
const int INF = 10000005;
struct edge {
int to;
int cap;
int rev;
};
int n, m;
vector<edge> G[MAX_N_M];
bool used[MAX_N_M];
void add_edge(int from, int to, int cap) { //重边不影响
G[from].push_back((edge){to, cap, G[to].size()});
G[to].push_back((edge){from, 0, G[from].size()-1});
}
int dfs(int v, int t, int f) {
if(v == t) return f;
used[v] = true;
for(int i=0; i<G[v].size(); i++) {
edge &e = G[v][i];
if(!used[e.to] && e.cap>0) {
int d = dfs(e.to, t, min(f, e.cap));
if(d > 0) {
e.cap -= d;
G[e.to][e.rev].cap += d;
return d;
}
}
}
return 0;
}
int max_flow(int s, int t) {
int flow = 0;
while(true) {
memset(used, 0, sizeof(used));
int f = dfs(s, t, INF);
if(f == 0) return flow;
flow += f;
}
}
int main() {
while(~scanf("%d%d", &n, &m)) {
memset(G, 0, sizeof(G)); //G需要初始化
for(int i=0; i<n; i++) {
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
add_edge(a, b, c);
}
printf("%d\n", max_flow(1, m));
}
return 0;
}