Pagini recente » Cod sursa (job #1512035) | Cod sursa (job #2344016) | Cod sursa (job #1786552) | Cod sursa (job #923812) | Cod sursa (job #1756115)
#include <cstdio>
#include <vector>
#include <cstring>
#define MAXN 1000
#define INF 1000000000
std::vector <int> G[MAXN+1];
int cap[MAXN+1][MAXN+1],flux[MAXN+1][MAXN+1];
char viz[MAXN+1];
int q[MAXN+1];
int tata[MAXN+1];
inline void add_Edge(int x,int y){
G[x].push_back(y);
}
int n;
inline char BFS(){
int b,e,i,nod;
memset(viz,0,sizeof(viz));
q[0]=1;
viz[1]=1;
b=0;
e=1;
do{
nod=q[b];
for(i=0;i<G[nod].size();i++)
if(viz[G[nod][i]]==0&&cap[nod][G[nod][i]]>flux[nod][G[nod][i]]){
viz[G[nod][i]]=1;
if(G[nod][i]!=n){
tata[G[nod][i]]=nod;
q[e]=G[nod][i];
e++;
}
}
b++;
}while(b<e);
return viz[n];
}
int main(){
FILE*fi,*fout;
int m,x,y,z,min,ans,nod,i;
fi=fopen("maxflow.in" ,"r");
fout=fopen("maxflow.out" ,"w");
fscanf(fi,"%d %d " ,&n,&m);
for(i=1;i<=m;i++){
fscanf(fi,"%d %d %d " ,&x,&y,&z);
add_Edge(x,y);
add_Edge(y,x);
cap[x][y]=z;
cap[y][x]=0;
}
ans=0;
while(BFS()){
for(i=0;i<G[n].size();i++)
if(viz[G[n][i]]==1&&cap[G[n][i]][n]>flux[G[n][i]][n]){
tata[n]=G[n][i];
nod=n;
min=INF;
while(nod>1){
if(min>cap[tata[nod]][nod]-flux[tata[nod]][nod])
min=cap[tata[nod]][nod]-flux[tata[nod]][nod];
nod=tata[nod];
}
nod=n;
while(nod>1){
flux[tata[nod]][nod]+=min;
flux[nod][tata[nod]]-=min;
nod=tata[nod];
}
ans+=min;
}
}
fprintf(fout,"%d" ,ans);
fclose(fi);
fclose(fout);
return 0;
}