网络流模板题,练着玩
#include<bits/stdc++.h>
const int N=15+5,M=1000+5;
using namespace std;
int head[M << 1],headnew[M << 1],nxt[M << 1],to[M << 1],flt[M << 1],cn=1;
int dis[N];
bool vis[N];
inline void read(int &x){
int f=1;x=0;char c=getchar();
while(c>'9'||c<'0'){
if(c=='-')
f=-1;
c=getchar();
}
while(c>='0'&&c<='9')
x=10*x+c-48,c=getchar();
x=x*f;
}
void create(int u,int v,int val){
cn++;
to[cn]=v;
flt[cn]=val;
nxt[cn]=head[u];
head[u]=cn;
cn++;
to[cn]=u;
flt[cn]=0;
nxt[cn]=head[v];
head[v]=cn;
}
queue<int> q;
int src,sink,tmp,inf=1e8;
int T,n,m,u,v,c,delta,ans;
bool bfs(){
int j;
memset(dis,0,sizeof(dis));
memset(vis,false,sizeof(vis));
while(!q.empty()) q.pop();
q.push(src);
vis[src]=true;
while(!q.empty()){
tmp=q.front();
for(int i=head[tmp];i;i=nxt[i]){
j=to[i];
if(flt[i] && !vis[j]){
q.push(j);
vis[j]=true;
dis[j]=dis[tmp]+1;
}
}
q.pop();
}
return vis[sink];
}
void init(){
cn=1;
memset(head,0,sizeof(head));
memset(nxt,0,sizeof(nxt));
memset(to,0,sizeof(to));
memset(flt,0,sizeof(flt));
}
int dfs(int u,int delta){
if(u==sink)
return delta;
int res=0,j;
for(int i=headnew[u];i;i=nxt[i]){
j=to[i];
if(flt[i] && dis[j]==dis[u]+1){
int dd=dfs(j,min(flt[i],delta));
flt[i]-=dd;
flt[i^1]+=dd;
delta-=dd;
res+=dd;
headnew[u]=i;
}
}
return res;
}
int main(){
read(T);
for(int i=1;i<=T;i++){
init();
ans=0;
read(n);read(m);
src=1,sink=n;
for(int j=1;j<=m;j++){
read(u);read(v);read(c);
create(u,v,c);
}
while(bfs()){
for(int i=1;i<=m;i++)
headnew[i]=head[i];
ans+=dfs(src,inf);
}
printf("Case %d: %d\n",i,ans);
}
return 0;
}