dinic:
#include<cstdio>
#include<cstring>
int S,T,map[20][20],f[20],data[20],n,m,t;
int min(int x,int y){
return x<y?x:y;
}
bool bfs(){
memset(f,-1,sizeof(f));
int op=0,cl=1;data[1]=S;f[1]=0;
bool flag=false;
while (op<cl){
op++;int u=data[op];
for (int v=1;v<=T;++v){
if (map[u][v]!=0&&f[v]==-1){
f[v]=f[u]+1;data[++cl]=v;
if (v==T) {
flag=true;
}
}
}
}
return flag;
}
int dfs(int u,int s){
if (u==T) return s;
int ss=s;
for (int v=1;v<=n;++v){
if (map[u][v]!=0&&f[v]==f[u]+1){
int x=dfs(v,min(map[u][v],s));
s-=x;
map[u][v]-=x;
map[v][u]+=x;
if (s==0) return ss;
}
}
return ss-s;
}
int main(){
freopen("hdu3549.in","r",stdin);
freopen("hdu3549.out","w",stdout);
scanf("%d",&t);
int tmpp=t;
while (t--){
scanf("%d%d",&n,&m);
memset(map,0,sizeof(map));
for (int i=1;i<=m;++i){
int x,y,c;
scanf("%d%d%d",&x,&y,&c);
map[x][y]+=c;
}
S=1;T=n;
int ans=0,maxlong=0x7fffffff;
while (bfs()){
int x=dfs(S,maxlong);
ans+=x;
}
printf("Case %d: %d\n",tmpp-t,ans);
}
return 0;
}
sap
#include<cstdio>
#include<cstring>
int S,T,t,n,m,map[20][20],h[20],f[20];
int min(int x,int y){
return x<y?x:y;
}
int sap(int u,int ss){
if (u==T) return ss;
int temp=ss;
int tmp=T-1;
for (int v=1;v<=n;++v){
if (map[u][v]!=0){
if (h[u]==h[v]+1){
int x=sap(v,min(map[u][v],ss));
ss-=x;
map[u][v]-=x;
map[v][u]+=x;
if (ss==0) return temp;
}
if (h[v]<tmp) tmp=h[v];
}
}
if (temp==ss){
f[h[u]]--;
if (f[h[u]]==0) h[1]=n;
h[u]=tmp+1;
f[h[u]]++;
}
return temp-ss;
}
int main(){
freopen("hdu3549.in","r",stdin);
freopen("hdu3549.out","w",stdout);
scanf("%d",&t);
int tmpp=t;
while (t--){
scanf("%d%d",&n,&m);
memset(map,0,sizeof(map));
for (int i=1;i<=m;++i){
int x,y,c;
scanf("%d%d%d",&x,&y,&c);
map[x][y]+=c;
}
S=1;T=n;
memset(h,0,sizeof(h));memset(f,0,sizeof(f));
f[0]=n;
int ans=0;
while (h[S]<n){
int x=sap(S,0x7fffffff);
ans+=x;
}
printf("Case %d: %d\n",tmpp-t,ans);
}
return 0;
}