题目链接:点击打开链接
题目大意:最大流模板题,问你1到n最大流量
题目思路:网络流EK算法就是不断找是否存在能s到t的路(增广路),然后找出这条路能够流的最大流量,然后整条路更新,直到没有增广路
以下是代码:
#include <iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define MAXN 205
#define inf 0x3f3f3f3f
#define rep(i,a,b) for(int i=a;i<=b;i++)
int n,m,flow[MAXN][MAXN],vis[MAXN],pre[MAXN],ans;
void EK(){
while(1){
memset(vis,0,sizeof(vis));
memset(pre,0,sizeof(pre));
queue<int>q;
vis[1]=1;
q.push(1);
while(!q.empty()){
int cnt=q.front();
q.pop();
if(cnt==n){break;}
rep(i,1,n){
if(!vis[i]&&flow[cnt][i]>0){
vis[i]=1;
q.push(i);
pre[i]=cnt;
}
}
}
if(!vis[n]){
break;
}
int minx=inf;
for(int i=n;i!=1;i=pre[i]){
minx=min(minx,flow[pre[i]][i]);
}
for(int i=n;i!=1;i=pre[i]){
flow[pre[i]][i]-=minx;
flow[i][pre[i]]+=minx;
}
ans+=minx;
}
}
int main()
{
while(~scanf("%d%d",&m,&n)){
memset(flow,0,sizeof(flow));
int u,v,c;
rep(i,1,m){
scanf("%d%d%d",&u,&v,&c);
flow[u][v]+=c;
}
ans=0;
EK();
printf("%d\n",ans);
}
return 0;
}