#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> #include<queue> using namespace std; int dp[100][100],pre[100]; const int tmin=999999999; int maxflow; void EK(int start,int end,int n){ while(1){ queue<int>q; q.push(1);//源点为1,进队 int minflow=tmin; memset(pre,0,sizeof(pre));//初始化增广路径数组,题目中的顶点是从1开始的 while(!q.empty()){//bfs找增广路 int u=q.front(); q.pop(); for(int i=1;i<=n;i++){ if(dp[u][i]>0&&!pre[i]){//pre[i]除了记录当前顶点的父亲,还记录当前顶点有没被访问过 pre[i]=u; q.push(i); } } } if(pre[end]==0)//顶点的父亲为空,表示找不到增广路,很容易理解吧。。 break; for(int i=end;i!=start;i=pre[i]){//找出增广路中最小残余量 minflow=min(dp[pre[i]][i],minflow); } for(int i=end;i!=start;i=pre[i]){//更新增广路中正反向弧的流量 dp[pre[i]][i]-=minflow; dp[i][pre[i]]+=minflow; } maxflow+=minflow; } } int main(){ int count=0; int n,m; int t; scanf("%d",&t); while(t--){ scanf("%d%d",&n,&m); memset(dp,0,sizeof(dp)); memset(pre,0,sizeof(pre)); count++; int u,v,w; for(int i=1;i<=m;i++){ scanf("%d%d%d",&u,&v,&w); dp[u][v]+=w; } maxflow=0; EK(1,n,n); printf("Case %d: %d\n",count,maxflow); } return 0; }
时间: 2024-11-11 20:13:26