Cod sursa(job #667995)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 24 ianuarie 2012 08:33:41
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include<fstream>
#include<vector>
#define NMAX 1<<10
#define INF 1<<28
using namespace std;
vector <short> G[NMAX];
int n,flow,paint,viz[NMAX],tata[NMAX],cost[NMAX][NMAX],coada[NMAX];
bool BFS() {
	int i,j,nr,nod,vecin;
	
	paint++;
	coada[1]=1;
	viz[1]=paint;
	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]!=paint&&cost[nod][vecin]>0) {
				coada[++nr]=vecin;
				tata[vecin]=nod;
				viz[vecin]=paint;
				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,j,e,nod;
	citire();
	for(flow=0;BFS();)
		for(j=0;j<G[n].size();j++) {
			nod=G[n][j];
			if(viz[nod]==paint&&cost[nod][n]>0) {
				tata[n]=nod;
				e=INF;
				for(i=n;i!=1;i=tata[i])
					e=min(e,cost[tata[i]][i]);
				if(e)
				for(i=n;i!=1;i=tata[i]) {
					cost[tata[i]][i]-=e;
					cost[i][tata[i]]+=e;
					}
				flow+=e;
				}
			}
	ofstream out("maxflow.out");
	out<<flow<<'\n';
	out.close();
	return 0;
}