Cod sursa(job #320812)

Utilizator stefysStefan stefys Data 5 iunie 2009 21:28:15
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.12 kb
#include <fstream>
#include <iostream>
using namespace std;

struct nod {
	unsigned int dest;
	int cap;
	nod *next, *inv;
};
nod *graf[1001];
unsigned int flux[1001][1001];

void add (unsigned int x, unsigned int y, unsigned int cap)
{
	nod *nou = new nod;
	nou->dest = y;
	nou->cap  = cap;
	nou->next = graf[x];
	graf[x] = nou;
	nod *nou2 = new nod;
	nou2->dest = x;
	nou2->cap = 0;
	nou2->next = graf[y];
	graf[y] = nou2;
	nou2->inv = nou;
	nou->inv  = nou2;
}

unsigned int nNoduri, nMuchii, parent[1001];
unsigned int BFS ()
{
	unsigned int vis[1001], Q[1001], *Q_push, *Q_pop, fluxmin[1001], visited[1001];
	//cautam un drum pe care avem flux (din 1 in nNoduri)
	memset(parent, 0, sizeof(parent));
	memset(vis, 0, sizeof(vis));
	memset(visited, 0, sizeof(visited));
	Q_push = Q_pop = Q;
	*(Q_push++) = 1;
	parent[1] = 0;
	visited[1] = 1;
	fluxmin[1] = 1<<30; // INF
	fluxmin[nNoduri] = 0;
	while (Q_pop < Q_push) {
		unsigned int crt = *(Q_pop++);
		//cerr << "Scoatem " << crt << endl;
		if (crt == nNoduri) break;
		for (nod *cnod = graf[crt]; cnod; cnod = cnod->next) {
			if (visited[cnod->dest]) continue;
			unsigned int cf = cnod->cap - flux[crt][cnod->dest];
			if (cf) {
				*(Q_push++) = cnod->dest; visited[cnod->dest] = 1; parent[cnod->dest] = crt;
				fluxmin[cnod->dest] = fluxmin[crt];
				if (cf < fluxmin[crt]) fluxmin[cnod->dest] = cf;
			}
		}
	}
	return fluxmin[nNoduri];
}
void maxflow ()
{
	unsigned int min;
	while ( (min=BFS()) ) {
		unsigned int crt = nNoduri;
		//cerr << nNoduri << ' ';
		while (parent[crt]) {
			//cerr << parent[crt] << ' ';
			flux[parent[crt]][crt] += min;
			flux[crt][parent[crt]] -= min;
			crt = parent[crt];
		}
		//cerr << "("<<min<<")" << '\n';
	}
}

int main ()
{
	ifstream in("maxflow.in");
	ofstream out("maxflow.out");
	in >> nNoduri >> nMuchii;
	for (unsigned int i=0; i<nMuchii; ++i) {
		unsigned int x,y,cap;
		in >> x >> y >> cap;
		add(x,y,cap);
	}
	in.close();
	maxflow();
	unsigned int rez=0;
	for (unsigned int i=2; i<=nNoduri; ++i)
		rez += flux[1][i];
	out << rez << '\n';
	out.close();
	return 0;
}