最大流基础题,一开始用邻接表做,wa了,最后看discuss发现数据可能存在重边,于是乖乖地改回了邻接矩阵,AC了,重新看了一下lrj的白书,总算是把最大流的那增广路算法搞明白了,嘿嘿~
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<vector>
#include<queue>
#include<map>
#include<stack>
using namespace std;
const int maxm = 210;
const int maxn = 210;
const int inf = 0x7fffffff;
int v[maxm],next[maxm],first[maxn],flow[maxn][maxn],cap[maxn][maxn],a[maxn],p[maxn];
int min(int a,int b){return a<b?a:b;}
int main()
{
#ifndef ONLINE_JUDGE
freopen("a.in", "r", stdin);
#endif
int m,n;
while(cin>>m>>n){
int ans=0;
memset(first,-1,sizeof(first));
memset(cap,0,sizeof(cap));
for(int i=1;i<=m;i++){
int u,v,c;
cin>>u>>v>>c;
cap[u][v]+=c;
}
memset(flow,0,sizeof(flow));
queue<int> q;
while(1){
memset(a,0,sizeof(a));
a[1]=inf;
q.push(1);
while(!q.empty()){
int u=q.front();q.pop();
for(int v=1;v<=n;v++)
if(!a[v]&&cap[u][v]>flow[u][v]){
p[v]=u;q.push(v);
a[v]=min(a[u],cap[u][v]-flow[u][v]);
}
}
if(a[n]==0) break;
ans+=a[n];
for(int i=n;i!=1;i=p[i]){
flow[p[i]][i]+=a[n];
flow[i][p[i]]-=a[n];
}
}
cout<<ans<<endl;
}
return 0;
}