Pagini recente » Cod sursa (job #2679785) | Cod sursa (job #1250581) | Cod sursa (job #2527969) | Cod sursa (job #787104) | Cod sursa (job #1824296)
#include <cstdio>
#include <vector>
#include <cstring>
#define MAXN 1000
#define INF 2000000000
int cap[MAXN+1][MAXN+1];
int flux[MAXN+1][MAXN+1];
std::vector <int> G[MAXN+1];
int q[MAXN+1];
bool viz[MAXN+1];
int from[MAXN+1];
inline bool BFS(int n){
int b,e,nod,x;
memset(viz,0,sizeof(viz));
memset(from,0,sizeof(from));
q[0]=1;
b=0;
e=1;
do{
nod=q[b];
for(auto x:G[nod])
if(viz[x]==0&&cap[nod][x]>flux[nod][x]){
viz[x]=1;
if(x!=n){
from[x]=nod;
q[e++]=x;
}
}
b++;
}while(b<e&&viz[n]==0);
return viz[n];
}
int main(){
FILE*fi,*fout;
int i,n,m,x,y,z,min;
long long ans;
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);
G[x].push_back(y);
G[y].push_back(x);
cap[x][y]+=z;
}
ans=0;
while(BFS(n)){
for(auto nod:G[n])
if(viz[nod]==1){
from[n]=nod;
x=nod;
min=INF;
while(x!=1){
if(cap[from[x]][x]-flux[from[x]][x]<min)
min=cap[from[x]][x]-flux[from[x]][x];
x=from[x];
}
x=nod;
while(x!=1){
flux[from[x]][x]+=min;
flux[x][from[x]]-=min;
x=from[x];
}
ans+=min;
}
}
fprintf(fout,"%lld" ,ans);
fclose(fi);
fclose(fout);
return 0;
}