Cod sursa(job #878796)

Utilizator dragosnicolaeNicolae Dragos dragosnicolae Data 14 februarie 2013 19:06:45
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include<stdio.h>
#include<vector>
#include<queue>
#include<string.h>
using namespace std;
int c[1005][1005],f[1005][1005],n,m,v[1005],t[1005],flux;
vector <int> l[1005];
void cit(){
	FILE *f;
	int a,b,cp,i;
	f=fopen("maxflow.in","r");
	fscanf(f,"%d%d",&n,&m);
	for(i=1;i<=m;i++){
		fscanf(f,"%d%d%d",&a,&b,&cp);
		l[a].push_back(b);
		l[b].push_back(a);
		c[a][b]+=cp;
	}
	fclose(f);
}
void bf(){
	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]]==0&&f[k][l[k][i]]<c[k][l[k][i]]){
				v[l[k][i]]=1;
				t[l[k][i]]=k;
				q.push(l[k][i]);
			}
	}
}
void edmonds_karp(){
	int min,k;
	bf();
	while(v[n]==1){
		for(unsigned int i=0;i<l[n].size();i++)
			if(v[l[n][i]]&&f[l[n][i]][n]<c[l[n][i]][n]){
				t[n]=l[n][i];
				min=2000000000;
				for(k=n;k!=1;k=t[k])
					if(min>c[t[k]][k]-f[t[k]][k])
						min=c[t[k]][k]-f[t[k]][k];
				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));
		bf();
	}
}
int main(){
	cit();
	edmonds_karp();
	FILE *f;
	f=fopen("maxflow.out","w");
	fprintf(f,"%d\n",flux);
	fclose(f);
	return 0;
}