Cod sursa(job #1262549)

Utilizator TarabanDragosTaraban Dragos-Petru TarabanDragos Data 13 noiembrie 2014 12:11:34
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
vector<int>L[1010];
int n,m,i,j,a,b,C,c[100100],q[1010][1010],x[1010][1010],v[1010],t[1010],vmin,s;
FILE *f,*g;
int bfs(){
	int p,u;
	memset(v,0,sizeof(v));
	p=u=1;
	c[1]=1;
	v[1]=1;
	while (p<=u) {
		a=c[p];
		for (int i=0; i<L[a].size(); i++){
			if (v[ L[a][i] ]==0&&q[a][ L[a][i] ]>x[a][ L[a][i] ]){
				u++;
				v[ L[a][i] ]=1;
				c[u]=L[a][i];
				t[ L[a][i] ]=a;
			}
		}
		p++;
	}
	return v[n];
}
int main(){
	f=fopen("maxflow.in","r");
	g=fopen("maxflow.out","w");
	fscanf(f,"%d%d",&n,&m);
	for(i=1;i<=m;i++){
		fscanf(f,"%d%d%d",&a,&b,&C);
		L[a].push_back(b);
		L[b].push_back(a);
		q[a][b]=C;
	}
	while (bfs()) {
		for (i=0; i<L[n].size(); i++){
			a=L[n][i];
			if(q[a][n] > x[a][n]&&v[a]==1){
				vmin = q[a][n] - x[a][n];
				while (t[a]!=0){
					if(q[ t[a] ][a]-x[ t[a] ][a]<vmin)
						vmin=q[ t[a] ][a]-x[ t[a] ][a];
					a=t[a];
				}
				a=L[n][i];
				x[a][n]+=vmin;
				x[n][a]-=vmin;
				while(t[a]!=0){
					x[ t[a] ][a]+=vmin;
					x[a][ t[a] ]-=vmin;
					a=t[a];
				}
				s+=vmin;
			}
		}
	}
	fprintf(g,"%d",s);




	fclose(f);
	fclose(g);
	return 0;
}