Pagini recente » Cod sursa (job #963946) | Cod sursa (job #2046176) | Cod sursa (job #1707090) | Cod sursa (job #1181556) | Cod sursa (job #302592)
Cod sursa(job #302592)
#include <iostream>
#include <algorithm>
#define FIN "maxflow.in"
#define FOUT "maxflow.out"
#define MAX_N 1010
using namespace std;
int F[MAX_N][MAX_N],C[MAX_N][MAX_N];
int N,M;
struct coada {int x,dad;} c[MAX_N];
int viz[MAX_N];
struct list{
int inf;
list *urm;
} *G[MAX_N];
void iofile(void){
freopen(FIN,"rt",stdin);
freopen(FOUT,"wt",stdout);
scanf("%d%d",&N,&M);
memset(G,0,sizeof(G));
list *q;
int x,y,z;
for (int i=1;i<=M;++i){
scanf("%d%d%d",&x,&y,&z);
q=new list;
q->inf=y;
q->urm=G[x];
G[x]=q;
q=new list;
q->inf=x;
q->urm=G[y];
G[y]=q;
C[x][y]=z;
}
fclose(stdin);
}
int minim(int nod){
int prec=c[nod].dad;
if (c[prec].x==1){ return C[1][c[nod].x]-F[1][c[nod].x];} else
return min(minim(prec),C[c[prec].x][c[nod].x]-F[c[prec].x][c[nod].x]);
}
int BF(void){
int p=1,u=1;
c[p].x=1;
c[p].dad=0;
list *q;
memset(viz,0,sizeof(viz));
viz[1]=1;
int def=0;
while (p<=u){
for (q=G[c[p].x];q;q=q->urm){
if (viz[q->inf]==0 && C[c[p].x][q->inf]-F[c[p].x][q->inf]>0){
++u;
c[u].x=q->inf;
c[u].dad=p;
if (q->inf==N){
def=1;
int mini=minim(u);
int x=u;
while (c[x].dad){
F[c[c[x].dad].x][c[x].x]+=mini;
F[c[x].x][c[c[x].dad].x]-=mini;
x=c[x].dad;
}
--u;
} else { viz[q->inf]=1;}
}
}
++p;
}
return def;
}
void flux(void){
int x=1;
while (x){
x=BF();
}
int suma=0;
for (list *q=G[N];q;q=q->urm){
suma+=F[q->inf][N];
}
printf("%d\n",suma);
fclose(stdout);
}
int main(void){
iofile();
flux();
return 0;
}