Cod sursa(job #302592)

Utilizator vanila_CPPIonescu Victor Cristian vanila_CPP Data 9 aprilie 2009 01:55:21
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#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;
}