http://acm.hdu.edu.cn/showproblem.php?pid=3549
分析:最大网络流的EK算法
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int NM=20;
const int MAX=0xfffffff;
int a[NM][NM],pre[NM],n,m,ans;
bool vis[NM];
bool BFS(int s,int d)
{
queue<int>q1;
memset(vis,0,sizeof(vis));
memset(pre,0,sizeof(pre));
q1.push(s);
pre[s]=s;
vis[s]=1;
while(!q1.empty())
{
int t=q1.front();q1.pop();
for(int i=1;i<=n;i++)
{
if(!vis[i]&&a[t][i]){
vis[i]=1;
pre[i]=t;
if(i==d) return true;
q1.push(i);
}
}
}
return false;
}
void EK(int s,int d)
{
int v,i;
while(BFS(s,d))
{
v=MAX;
for(i=d;i!=s;i=pre[i]){
if(v>a[pre[i]][i])
v=a[pre[i]][i];
}
for(i=d;i!=s;i=pre[i]){
a[pre[i]][i]-=v;
a[i][pre[i]]+=v; //逆向回溯
}
ans+=v;
}
}
int main()
{
int T,i,x,y,v,j;
scanf("%d",&T);
j=1;
while(T--)
{
scanf("%d%d",&n,&m);
memset(a,0,sizeof(a));
for(i=0;i<m;i++){
scanf("%d%d%d",&x,&y,&v);
a[x][y]+=v; //重边
}
ans=0;
EK(1,n);
printf("Case %d: %d\n",j++,ans);
}
return 0;
}