Cod sursa(job #302446)

Utilizator carmen_cnglCarmen Popescu carmen_cngl Data 8 aprilie 2009 21:41:39
Problema Flux maxim Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <iostream>   
#include <fstream>   
#include <queue>  
  
using namespace std;   

int n,m;
int c[102][102],f[102][102];
int viz[1050];

int parcurgere(){
	queue<int> q;
	int v;
	for (int i=1;i<=n;i++)
		viz[i]=0;
	
	q.push(1); viz[1]=-1;
	
	while (!q.empty()) { 
		v=q.front();
		q.pop();
		for (int i=1;i<=n;i++)
			if (c[v][i]>f[v][i] && viz[i]==0){
				viz[i]=v;
				q.push(i);
			}				
	}
	if (viz[n]!=0)
		return 1;
	else
		return 0;
}
  
void citire() {
	int x,y,w;
	ifstream fin("maxflow.in");
	fin>>n>>m;
	for (int i=0;i<m;i++){
		fin>>x>>y>>w;
		c[x][y]+=w;
	}
	for (int i=1;i<=n;i++)
		for (int j=i;j<=n;j++)
			f[i][j]=f[j][i]=0;
}

int main(void) {   
	int min,x,y,v;
	
	citire();
	
	while (parcurgere()) {
		x=viz[n]; y=n;
		min=c[x][y]-f[x][y];
		while (x!=1) {
			y=x;
			x=viz[y];
			v=c[x][y]-f[x][y];
			if (v<min) 
				min=v;
		}
		x=viz[n]; y=n;
		f[x][y]+=min;
		while (x!=1) {
			y=x;
			x=viz[y];
			f[x][y]+=min;
		}
	}
	
	v=0;
	for (x=1;x<=n;x++)
		v+=(f[1][x]-f[x][1]);
	
	ofstream g("maxflow.out");
	g<<v;
	g.close();
	
    return 0;   
}