Cod sursa(job #952162)

Utilizator OpportunityVlad Negura Opportunity Data 22 mai 2013 19:52:01
Problema Flux maxim Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <fstream>
#include <vector>
#include <iostream>
#include <stdio.h>
using namespace std;
ifstream fi("maxflow.in");
ofstream fo("maxflow.out");

long n,m,i,j,C[1001][1001],viz[1001],TT[1001],F[1001][1001],rs;
vector< long > G[1001],q;

int DFS(){
	
	for (i=1; i<=n; i++) viz[i]=0;
	q.push_back(1); viz[1]=1;
	while (!q.empty()){
		long nod=q.back(); q.pop_back();
		for (size_t k=0; k<G[nod].size(); k++){
			int v=G[nod][k];
			if (!viz[v] && C[nod][v]>0){
				viz[v]=1;
				q.push_back(v);
				TT[v]=nod;
				if (v==n) return 1;
			}
		}
	}
	
	return 0;
}


int main(){
	
	fi >> n >> m;
	for (i=1; i<=m; i++){
		int x,y,z;
		fi >> x >> y >> z;
		G[x].push_back(y);
		C[x][y]=z;
	}
	
	while (DFS()){
		/*
		for (i=1; i<=n; i++) cout << TT[i] << ' '; 
		cout << endl;
		for (i=1; i<=n; i++){
			for (j=1; j<=n; j++){
				cout << C[i][j] << ' ';
			}
			cout << endl;
		}
		cout << endl;
		for (i=1; i<=n; i++){
			for (j=1; j<=n; j++){
				cout << F[i][j] << ' ';
			}
			cout << endl;
		}
		*/
		long fmin=1000000;
		for (i=n; i!=1; i=TT[i]){
			fmin=min(fmin,(C[TT[i]][i]));
		}
		if (!fmin) break;
		
		for (i=n; i!=1; i=TT[i]){
			F[TT[i]][i]+=fmin;
			C[TT[i]][i]-=fmin;
		}
		rs+=fmin;
		/*for (i=1; i<=n; i++) cout << TT[i] << ' '; 
		cout << endl;
		for (i=1; i<=n; i++){
			for (j=1; j<=n; j++){
				cout << C[i][j] << ' ';
			}
			cout << endl;
		}
		cout << endl;
		for (i=1; i<=n; i++){
			for (j=1; j<=n; j++){
				cout << F[i][j] << ' ';
			}
			cout << endl;
		}
		cout << rs << endl;*/
	}
	
	fo << rs;
	
	return 0;
}