Cod sursa(job #647502)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 11 decembrie 2011 15:48:05
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include<fstream>
#include<iostream>
#include<vector>
#define NMAX 1<<10
#define INF 1<<28
using namespace std;
vector <int> G[NMAX];
int n,flow,lvl,viz[NMAX],tata[NMAX],cost[NMAX][NMAX],coada[NMAX];
bool BFS() {
	int i,j,nr,nod,vecin;
	
	lvl++;
	coada[1]=1;
	viz[1]=lvl;
	nr=1;
	
	for(i=1;i<=nr;i++) {
		nod=coada[i];
		for(j=0;j<G[nod].size();j++) {
			vecin=G[nod][j];
			if(viz[vecin]!=lvl&&cost[nod][vecin]>0) {
				coada[++nr]=vecin;
				tata[vecin]=nod;
				viz[vecin]=lvl;
				if(vecin==n)
					return 1;
				}
			}
		}
	return 0;
}
void citire() {
	int i,x,y,w,m;
	ifstream in("maxflow.in");
	in>>n>>m;
	for(i=0;i<m;i++) {
		in>>x>>y>>w;
		G[x].push_back(y);
		G[y].push_back(x);
		cost[x][y]=w;
		}
	in.close();
}
int main() {
	int i,e,clo=clock();
	citire();
	for(flow=0;BFS();flow+=e) {
		e=INF;
		for(i=n;i!=1;i=tata[i])
			if(e>cost[tata[i]][i])
				e=cost[tata[i]][i];
			//e=min(e,cost[tata[i]][i]);
		for(i=n;i!=1;i=tata[i]) {
			cost[tata[i]][i]-=e;
			cost[i][tata[i]]+=e;
			}
		}
	ofstream out("maxflow.out");
	out<<flow<<'\n';
	out.close();
	cout<<clock()-clo<<" ms\n";
	return 0;
}