Pagini recente » Rezultatele filtrării | Rezultatele filtrării | Borderou de evaluare (job #235936) | Rezultatele filtrării | Cod sursa (job #696349)
Cod sursa(job #696349)
#include <cstdio>
#include <cstring>
#include <vector>
#define NMAX 1011
#define INF 1<<30
using namespace std;
vector <int> G[NMAX];
int N, viz[NMAX],c[NMAX][NMAX],f[NMAX][NMAX],t[NMAX],q[NMAX];
void Read(){
int M,x,y,cost;
freopen("maxflow.in","r",stdin);
scanf("%d%d",&N,&M);
for(;M>0;M--){
scanf("%d%d%d",&x,&y,&cost);
G[x].push_back(y);
G[y].push_back(x);
c[x][y]=cost;
}
}
bool BF(){
int k,i,nod;
memset(viz,0,sizeof(viz));
k=1; q[k]=1; viz[1]=1;
for(i=1;i<=k;i++){
nod=q[i];
if(nod==N) continue;
for(vector <int>::iterator it=G[nod].begin();it!=G[nod].end();it++){
if(c[nod][*it]==f[nod][*it] || viz[*it]) continue;
viz[*it]=1;
q[++k]=*it;
t[*it]=nod;
}
}
return viz[N];
}
void Solve(){
freopen("maxflow.out","w",stdout);
int Flux=0,fmin,i;
for(; BF();){
for(vector <int>::iterator it=G[N].begin();it!=G[N].end();it++){
if(f[*it][N]==c[*it][N] || !viz[*it]) continue;
fmin=INF;
t[N]=*it;
for(i=N;i!=1;i=t[i])
fmin=min(fmin,c[t[i]][i]-f[t[i]][i]);
if(!fmin) continue;
Flux+=fmin;
for(i=N;i!=1;i=t[i]){
f[t[i]][i]+=fmin;
f[i][t[i]]-=fmin;
}
}
}
printf("%d\n",Flux);
}
int main(){
Read();
Solve();
return 0;
}