Cod sursa(job #809848)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 9 noiembrie 2012 08:45:01
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include<iostream>
#include<fstream>
using namespace std;

const int NMAX = 1001;

struct NOD {
	int info;
	NOD *urm;
};
typedef NOD* PNOD;

int c[NMAX][NMAX],cd[NMAX],viz[NMAX],p[NMAX],n;
PNOD v[NMAX];

PNOD nou(int info)
{
	PNOD p;
	p=new NOD;
	p->info=info;
	p->urm=NULL;
	return p;
}

void adaugare(PNOD &p, int x)
{
	PNOD aux;
	aux=nou(x);
	aux->urm=p;
	p=aux;
}

int bfs()
{
	int i,nod,st,dr;
	for(i=1;i<=n;i++)
		viz[i]=0;
	cd[1]=1;
	viz[1]=1;
	st=1;
	dr=1;
	while(st<=dr) {
		nod=cd[st];
		st++;
		for(PNOD aux=v[nod];aux!=NULL;aux=aux->urm)  
			if(viz[aux->info]==0 && c[nod][aux->info]>=1) {
				viz[aux->info]=1;
				cd[++dr]=aux->info;
				p[aux->info]=nod;
				if(aux->info==n)
					return 1;
			}
	}
	return 0;
}

void citire()
{
	int m,i,x,y,capacity;
	ifstream f("maxflow.in");
	f>>n>>m;
	for(i=1;i<=n;i++)
		v[i]=NULL;
	for(i=1;i<=m;i++) {
		f>>x>>y>>capacity;
		adaugare(v[x],y);
		adaugare(v[y],x);
		c[x][y]=capacity;
	}
	f.close();
}

int edmonds_karp()
{
	int fluxcurent,fluxmax,nod;
	for(fluxmax=0 ; bfs(); fluxmax=fluxmax+fluxcurent) {
		fluxcurent=(1<<30);
		for(nod=n;nod!=1;nod=p[nod]) 
			fluxcurent=min(fluxcurent,c[p[nod]][nod]);
		for(nod=n;nod!=1;nod=p[nod]) {
			c[p[nod]][nod]=c[p[nod]][nod]-fluxcurent;
			c[nod][p[nod]]=c[nod][p[nod]]+fluxcurent;
		}
	}
	return fluxmax;
}

int main () 
{
	ofstream g("maxflow.out");
	citire();
	g<<edmonds_karp();
	g.close();
	return 0;
}