邻接表实现的最大流裸题
上代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<cstdlib>
#include<vector>
#define rep(i,a,b) for (int i=a;i<=b;i++)
using namespace std;
struct P{
int v,w,rec;
};
int dis[250]={0},n,m;
int iter[250]={0};
vector<P> G[250];
void add_edge(int u,int v,int w){
G[u].push_back((P){v,w,G[v].size()});
G[v].push_back((P){u,0,G[u].size()-1});
}
void bfs(){
memset(dis,-1,sizeof dis);
queue<int> q;
q.push(1);
dis[1]=0;
while (!q.empty()){
int cur=q.front();
q.pop();
for (int i=0;i<G[cur].size();i++){
P &e=G[cur][i];
if (e.w>0&&dis[e.v]<0){
dis[e.v]=dis[cur]+1;
q.push(e.v);
}
}
}
}
int find(int x,int flow){
if (x==n) return flow;
for (int &i=iter[x];i<G[x].size();i++){
P &e=G[x][i];
if (e.w>0&&dis[e.v]>dis[x]){
int d=find(e.v,min(flow,e.w));
if (d>0){
e.w-=d;
G[e.v][e.rec].w+=d;
return d;
}
}
}
return 0;
}
int Max_flow(){
int ans=0;
while (true){
bfs();
if (dis[n]<0) return ans;
memset(iter,0,sizeof iter);
int f;
while ((f=find(1,0x7f7f7f7f))>0) ans+=f;
}
}
int main(){
int T;
scanf("%d",&T);
rep(z,1,T){
scanf("%d%d",&n,&m);
rep(i,1,n) G[i].clear();
rep(i,1,m){
int x,y,w;
scanf("%d%d%d",&x,&y,&w);
add_edge(x,y,w);
}
printf("Case %d: %d\n",z,Max_flow());
}
return 0;
}