题目链接:http://poj.org/problem?id=1273
题意:
就是排水问题,裸裸的最大流.
代码:
#include <cstring>
#include <iostream>
#include <cstdio>
#include <vector>
#define INF (1 << 30)
#define N 205
#define E 205
#define fp(_p,_q,_r) for(int _p = _q;_p < _r;_p ++)
using namespace std;
typedef long long ll;
struct edge { int to,cap,rev; edge(int a = 0,int b = 0,int c = 0):to(a),cap(b),rev(c){}};
vector <edge> G[N];
int n,m,size[N];
bool used[N];
void addedge(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));
}
ll dfs(int v,int t,int f){
if(v == t) return f;
used[v] = 1;
fp(i,0,G[v].size()){
edge & e = G[v][i];
if(!used[e.to] && e.cap > 0){
ll 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;
}
ll max_flow(int s,int t){
ll flow = 0;
while(1){
memset(used,0,sizeof(used));
ll f = dfs(s,t,INF);
if(!f) return flow;
flow += f;
}
}
int main(void)
{
while(scanf("%d%d",&n,&m) != EOF){
memset(size,0,sizeof(size));
fp(i,0,n){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
addedge(a,b,c);
}
cout << max_flow(1,m) << endl;
fp(i,0,n){
G[i].clear();
}
}
return 0;
}