Cod sursa(job #370232)

Utilizator victor.ionescuIonescu Victor Cristian victor.ionescu Data 30 noiembrie 2009 16:32:54
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <fstream>
#include <vector>
#include <list>
#include <cstring>
using namespace std;
ifstream fi("maxflow.in");
ofstream fo("maxflow.out");
int N,M,flow,dad[1024],viz[1024],C[1024][1024],F[1024][1024];
vector<int> G[1024];
list<int> L;

int BFS(){
	L.push_back(1);
	memset(viz,0,sizeof(viz));
	viz[1]=1;dad[1]=0;
	while (!L.empty()){
		list<int>::iterator it=L.begin();
		for (unsigned int i=0;i<G[*it].size();++i) if (!viz[G[*it][i]] && C[*it][G[*it][i]]-F[*it][G[*it][i]]>0){
			viz[G[*it][i]]=1;
			L.push_back(G[*it][i]);
			dad[G[*it][i]]=*it;
		}
		L.erase(it);
	}
	return viz[N];
}

int main(){
	fi>>N>>M;
	int x,y,z;
	for (int i=1;i<=M;++i){
		fi>>x>>y>>z;
		C[x][y]=z;
		G[x].push_back(y);G[y].push_back(x);
	}
	for (flow=0;BFS();)
		for (int i=1;i<=N;++i) if (C[i][N]-F[i][N]>0){
			int sat=C[i][N]-F[i][N];
			if (sat==0) continue;
			for (int j=i;j!=1;j=dad[j]) sat=min(sat,C[dad[j]][j]-F[dad[j]][j]);
			if (sat==0) continue;
			F[i][N]+=sat;
			F[N][i]-=sat;
			for (int j=i;j!=1;j=dad[j]) { F[dad[j]][j]+=sat; F[j][dad[j]]-=sat; }
			flow+=sat;
		}
	fo<<flow<<"\n";
	fi.close();fo.close();
	return 0;
}