标准网络流
注意:
1、这个题中,流单向
2、环可以不考虑
3、如果有多条 u-->v,直接相加就可以
/*
ID : lancelo2
PROG : ditch
LANG : C++
*/
#include <fstream>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstring>
#define INT_MAX 100000000
using namespace std;
const int MAXN = 200;
int n, p[MAXN+1], map[MAXN+1][MAXN+1];
int N, M;
bool ek_bfs(int s, int e)
{
queue<int> q;
bool flag[MAXN+1];
memset(flag, 0, sizeof(flag));
memset(p, -1, sizeof(p));
q.push(s);
flag[s] = true;
while(!q.empty()){
int n = q.front();
if(n == e)
return true;
q.pop();
for(int i = 1; i <= e; i++){
if(map[n][i] > 0 && !flag[i]){
flag[i] = true;
p[i] = n;
q.push(i);
}
}
}
return false;
}
int ek(int s, int e)
{
int u, flow_ans = 0, mn;
while(ek_bfs(s, e)){
mn = INT_MAX;
u = e;
while(p[u] != -1){
mn = min(mn, map[p[u]][u]);
u = p[u];
}
flow_ans += mn;
u = e;
while(p[u] != -1){
map[p[u]][u] -= mn;
map[u][p[u]] += mn;
u = p[u];
}
}
return flow_ans;
}
int main()
{
ofstream fout("ditch.out");
ifstream fin("ditch.in");
memset(map, 0, sizeof(map));
fin >> N >> M;
int u, v, w;
for(int i = 0; i < N; i++){
fin >> u >> v >> w;
if(map[u][v]){
map[u][v] += w;
}else{
map[u][v] = w;
}
}
int ans = ek(1, M);
fout << ans << endl;
}