http://poj.org/problem?id=1273
分析:最大流的dinic实现模板(邻接矩阵)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int NM=205;
const int MAX=0xfffffff;
int a[NM][NM],level[NM],n,m;
inline int min(int x,int y){
return x<y?x:y;
}
//对顶点进行标号、找出层次图
bool bfs(int s)
{
int i,t;
queue<int>q1;
memset(level,0,sizeof(level));
level[s]=1;
q1.push(s);
while(!q1.empty())
{
t=q1.front();q1.pop();
for(i=1;i<=n;i++){
if(a[t][i] && !level[i]){
level[i]=level[t]+1;
q1.push(i);
}
}
}
return level[n]!=0; //汇点是否在层次图中
}
//在层次图中寻找增广路径进行增广
int DFS(int s,int cp)
{
if(s==n) return cp;
for(int i=1;i<=n;i++)
{
if(a[s][i] && level[i]==level[s]+1){
int t=DFS(i,min(cp,a[s][i])); //寻找每条边最大可以通过的流量
if(t){
a[s][i]-=t;
a[i][s]+=t;
return t;
}
}
}
return 0;
}
int dinic(int s)
{
int flow=0;
//汇点不在层次图中(即断层),查找完毕
while(bfs(s)) {
flow+=DFS(s,MAX);
}
return flow;
}
int main()
{
int i,x,y,v;
while(~scanf("%d%d",&m,&n))
{
memset(a,0,sizeof(a));
for(i=1;i<=m;i++){
scanf("%d%d%d",&x,&y,&v);
a[x][y]+=v;
}
printf("%d\n",dinic(1));
}
return 0;
}