Cod sursa(job #729242)

Utilizator dragosnicolaeNicolae Dragos dragosnicolae Data 29 martie 2012 13:38:43
Problema Flux maxim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
//nod sursa-1  nod destinatie-n
#include<stdio.h>
#include<string.h>
#include<vector>
#include<queue>
#define nmax 1005
using namespace std;
int n,m,c[nmax][nmax],f[nmax][nmax],t[nmax],v[nmax],flux;
vector <int> l[nmax];
void cit(){
	FILE *f;
	int i,a,b,cap;
	f=fopen("maxflow.in","r");
	fscanf(f,"%d%d",&n,&m);
	for(i=1;i<=m;i++){
		fscanf(f,"%d%d%d",&a,&b,&cap);
		c[a][b]+=cap;
		l[a].push_back(b);
		l[b].push_back(a);
	}
	fclose(f);
}
void drum(){
	int k;
	queue <int> q;
	q.push(1);
	v[1]=1;
	while(!q.empty()){
		k=q.front();
		q.pop();
		if(k==n)
			continue;
		for(unsigned int i=0;i<l[k].size();i++){
			if(v[l[k][i]]||c[k][l[k][i]]==f[k][l[k][i]])
				continue;
			q.push(l[k][i]);
			v[l[k][i]]=1;
			t[l[k][i]]=k;
		}
	}
}
void edmonds_karp(){
	int k,min;
	memset(v,0,sizeof(v));
	memset(t,0,sizeof(t));
	drum();
	while(v[n]==1){
		for(unsigned int i=0;i<l[n].size();i++){
			k=l[n][i];
			if(c[k][n]==f[k][n])
				continue;
			t[n]=k;
			min=2000000000;
			for(k=n;k!=1;k=t[k])
				if(c[t[k]][k]-f[t[k]][k]<min)
					min=c[t[k]][k]-f[t[k]][k];
			if(min!=0){
				for(k=n;k!=1;k=t[k]){
					f[t[k]][k]+=min;
					f[k][t[k]]-=min;
				}
				flux+=min;
			}
		}
		memset(v,0,sizeof(v));
		memset(t,0,sizeof(t));
		drum();
	}
}
void afis(){
	FILE *f;
	f=fopen("maxflow.out","w");
	fprintf(f,"%d\n",flux);
	fclose(f);
}
int main(){
	cit();
	edmonds_karp();
	afis();
	return 0;
}