#include<cstdio> //EK()算法。时间复杂度(VE^2)
#include<queue>
#include<cstring>
using namespace std;
const int maxn = 100;
const int INF = (1<<30)-1;
int g[maxn][maxn];
int flow[maxn],pre[maxn];
bool vis[maxn];
int n,m;
int bfs(int s,int e){
memset(pre,-1,sizeof(pre));
memset(vis,false,sizeof(vis));
queue<int > q;
vis[s] = true;
for(int i=1;i<=n;i++) flow[i]=INF;
q.push(s);
while(!q.empty()){
int now = q.front(); q.pop();
if(now==n) break;
for(int i=1;i<=n;i++){ //寻找增广路最小流量
if(!vis[i]&&g[now][i]>0){
vis[i] = true;
flow[i] = min(flow[now],g[now][i]);
pre[i] = now;
q.push(i);
}
}
}
if(!vis[e]|| e==1) //找不到完整的增广路or源点汇点重合
return -1;
else
return flow[e];
}
int EK(int s,int e){
int temp,d,res,maxflow;
maxflow = 0;
while((d=bfs(s,e))!=-1){
maxflow += d;
temp=n;
while(temp!=1){
res = pre[temp];
g[res][temp]-=d; //正向边
g[temp][res]+=d; //反向边
temp = res;
}
}
return maxflow;
}
int main(){
int T,ca=1;
int start,end,capacity;
scanf("%d",&T);
while(T--){
memset(g,0,sizeof(g));
scanf("%d %d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&start,&end,&capacity);
g[start][end]+=capacity;
}
printf("Case %d: %d\n",ca++,EK(1,n));
}
return 0;
}
最大流EK算法模板
最新推荐文章于 2020-08-06 15:16:26 发布