POJ 1273
最大流基础题。基本的思路是:先找增广路,路上的流量减掉,反流量(名字忘记了)加上,直到找不到增广路。
#include <cstdio> #include <cstring> #include <queue> #include <climits> using std::queue; using std::memset; const int MAX = 400; int flow[MAX][MAX]; int father[MAX]; bool visit[MAX]; int n,m; int ford_fulkerson() { int ans = 0; queue<int> q; while(1) { while(!q.empty()) q.pop(); q.push(1); memset(visit, 0, sizeof(visit)); memset(father, 0, sizeof(father)); while(!q.empty()) { int from = q.front(); q.pop(); if(from == n) break; for(int to = 1 ; to <= n; to++) { if(flow[from][to] && !visit[to]) { father[to] = from; q.push(to); visit[to] = true; } } } if(!visit[n]) return ans; int minflow = INT_MAX; for(int to = n; to != 1; to = father[to]) { int from = father[to]; if(minflow > flow[from][to]) minflow = flow[from][to]; } for(int to = n; to != 1; to = father[to]) { int from = father[to]; flow[from][to] -= minflow; flow[to][from] += minflow; } ans += minflow; } } int main() { while(scanf("%d%d",&m,&n)!=EOF) { memset(flow, 0, sizeof(flow)); for(int i = 0 ; i < m; i++) { int from, to, val; scanf("%d%d%d",&from, &to, &val); flow[from][to] += val; } printf("%d\n", ford_fulkerson()); } }