https://vjudge.net/problem/HDU-3549
The rudiments of Network Problem
I use the algorithm of Edomonds-Karp
You should pay attention to the double edge
And to improve my English power
I will write in English of my blog
another reason is the typewriting of Ubuntu is very hard to use
The code of AC:
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10,inf=(1<<29);
int A[100][100];
int head[N],ver[N],edge[N],Next[N],incf[N],pre[N],v[N];
int s,t;
int maxflow;
int tot;
void add(int x,int y,int z){
ver[++tot]=y;
edge[tot]=z;
Next[tot]=head[x];
head[x]=tot;
ver[++tot]=x;
edge[tot]=0;
Next[tot]=head[y];
head[y]=tot;
}
bool bfs(){
memset(v,0,sizeof v);
queue<int> q;
q.push(s);
v[s]=1;
incf[s]=inf;
while(q.size()){
int x=q.front();
q.pop();
for(int i=head[x];i;i=Next[i]){
if(edge[i]){
int y=ver[i];
if(v[y]) continue;
incf[y]=min(edge[i],incf[x]);
v[y]=1;
q.push(y);
pre[y]=i;
if(y==t) return 1;
}
}
}
return 0;
}
void update(){
int x=t;
while(x!=s){
int i=pre[x];
edge[i]-=incf[t];
edge[i^1]+=incf[t];
x=ver[i^1];
}
maxflow+=incf[t];
}
int main(){
int T;
int a,b,c;
cin>>T;
int flag=0;
while(T--){
int n,m;
cin>>n>>m;
tot=1;
maxflow=0;
s=1,t=n;
memset(A,0,sizeof A);
for(int i=0;i<N;++i){
incf[i]=edge[i]=head[i]=Next[i]=ver[i]=pre[i]=v[i]=0;
}
for(int i=1;i<=m;++i){
cin>>a>>b>>c;
A[a][b]+=c;
}
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
if(A[i][j]>0)
add(i,j,A[i][j]);
}
}
while(bfs()) update();
cout<<"Case "<<++flag<<": "<<maxflow<<endl;
}
}