http://acm.hdu.edu.cn/showproblem.php?pid=3549
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#define M 30000
#define N 10000
#define INF 1000000000
using namespace std;
struct edge {
int v,cap,rev;
};
vector<edge>E[M];
int n,m,i,h[N],t,u,v,f,w,d[N],j,k,ans;
void bfs() {
memset(d,-1,sizeof(d));
d[1]=0;
queue<int>q;
q.push(1);
while (q.size()) {
int u=q.front();
q.pop();
for (int i=0; i<E[u].size(); i++) {
edge &e=E[u][i];
if (e.cap>0&&d[e.v]<0) {
q.push(e.v);
d[e.v]=d[u]+1;
}
}
}
}
int dfs(int s,int t,int f) {
if (s==t) return f;
for (int &i=h[s]; i<E[s].size(); i++) {
edge &e=E[s][i];
if (e.cap>0&&d[s]<d[e.v]) {
int d=dfs(e.v,t,min(f,e.cap));
if (d>0) {
e.cap-=d;
E[e.v][e.rev].cap+=d;
return d;
}
}
}
return 0;
}
int main() {
scanf("%d",&t);
for (int j=1; j<=t; j++) {
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++){
E[i].clear();
}
for (i=1; i<=m; i++) {
scanf("%d%d%d",&u,&v,&w);
E[u].push_back(edge {v,w,E[v].size()});
E[v].push_back(edge {u,0,E[u].size()-1});
}
ans=0;
while (1) {
bfs();
if (d[n]<0) break;
memset(h,0,sizeof(h));
while ((f=dfs(1,n,INF))>0) {
ans+=f;
}
}
printf("Case %d: %d\n",j,ans);
}
}