Pagini recente » Cod sursa (job #3254127) | Cod sursa (job #2422369) | Cod sursa (job #305996) | Cod sursa (job #1515400) | Cod sursa (job #1500647)
#include<stdio.h>
#include<cstring>
#define N 1024
int vecini[N][N],cap[N][N],coada[N],flux[N][N],seen[N],prev[N];
int n;
int bfs(){
int first=0,last=1;
coada[0]=1;
seen[1]=1;
memset(prev, 0, sizeof prev);
memset(seen, 0, sizeof seen);
while(first<last&&seen[n]==0){
int i;
for(i=1;i<=vecini[coada[first]][0];i++){
int nod=vecini[coada[first]][i];
if(seen[nod]==0&&cap[coada[first]][nod]>flux[coada[first]][nod]){
prev[nod]=coada[first];
seen[nod]=1;
coada[last++]=nod;
}
}
first++;
}
return seen[n];
}
int main(){
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
int m;
scanf("%d%d",&n,&m);
int i;
for(i=0;i<m;i++){
int x,y,capacitate;
scanf("%d%d%d",&x,&y,&capacitate);
vecini[x][vecini[x][0]+1]=y;
vecini[y][vecini[y][0]+1]=x;
vecini[x][0]++,vecini[y][0]++;
cap[x][y]+=capacitate;
}
while(bfs()){
for(i=1;i<=vecini[n][0];i++){
int nod=vecini[n][i];
if(seen[nod]&&cap[nod][n]>flux[nod][n]){
prev[n]=nod;
int min=1000000000;
int j=n;
while(j!=1){
if(min>cap[prev[j]][j]-flux[prev[j]][j])
min=cap[prev[j]][j]-flux[prev[j]][j];
j=prev[j];
}
j=n;
while(j!=1){
flux[prev[j]][j]+=min;
flux[j][prev[j]]-=min;
j=prev[j];
}
}
}
}
int sum=0;
for(i=1;i<n;i++)
sum+=flux[i][n];
printf("%d",sum);
return 0;
}