题目链接:http://poj.org/problem?id=1273
题意:给你m条边,n个点,(0<=m<=200, 2<=n <=200),每条边包含两个端点和其权值,求从点1到点n的最大流。
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <math.h>
#define pi acos(-1)
#define fastio ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;
const int INF = 0x3f3f3f3f;
const LL ll_INF = 0x3f3f3f3f3f3f3f3f;
const int maxn = 200 + 10;
const int mod = 1e9 + 7;
int cap[maxn][maxn];
int dis[maxn];
int s, t;
int n, m;
bool BFS()
{
queue<int> que;
memset(dis, -1, sizeof(dis));
dis[s] = 0;
que.push(s);
while(!que.empty()){
int cur = que.front(); que.pop();
for(int i=1; i<=n; i++){
if(dis[i]==-1 && cap[cur][i]>0){
dis[i] = dis[cur]+1;
que.push(i);
}
}
}
if(dis[t]==-1) return false;
else return true;
}
int DFS(int cur, int low)
{
if(cur == t) return low;
int tmp=0;
for(int i=1; i<=n; i++){
if( cap[cur][i]>0 && dis[i] == dis[cur]+1 && (tmp = DFS(i, min(low, cap[cur][i])))){
cap[cur][i] -= tmp;
cap[i][cur] += tmp;
return tmp; // 增广路一条一条地找
}
}
return 0;
}
int main()
{
while(~scanf("%d%d", &m, &n)){
memset(cap, 0, sizeof(cap));
s = 1;
t = n;
for(int i=1; i<=m; i++){
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
cap[u][v] += w; // 记得是 += ,因为可能出现多条重复路径叠加。
}
int ans = 0, tmp=0;
while(BFS()){
if(tmp = DFS(s, INF))
ans += tmp;
}
printf("%d\n", ans);
}
}