Cod sursa(job #443571)

Utilizator ooctavTuchila Octavian ooctav Data 17 aprilie 2010 16:48:48
Problema Flux maxim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include<cstdio>
#include<vector>
#include<bitset>
#include<queue>
using namespace std;
const int NMAX = 1001;
const int MMAX = 5001;
const int INF = 1000000000;
int N, M;
vector<int> V[NMAX];
int tata[NMAX];
int c[NMAX][NMAX];
int f[NMAX][NMAX];
int flux = 0;

void citeste()
{
	int x, y, cost;
	scanf("%d%d",&N,&M);
	for(int i = 1 ; i <= M ; i++)
	{
		scanf("%d%d%d",&x,&y,&cost);
		V[x].push_back(y);
		V[y].push_back(x);
		c[x][y] = cost;
	}
}

int bfs()
{
	bitset<NMAX> viz(false);
	queue<int> Q;
	int nod;
	vector<int> :: iterator it;
	
	Q.push(1);
	viz[1].flip();
	
	while(!Q.empty())
	{
		nod = Q.front();
		Q.pop();
		for(it = V[nod].begin() ; it != V[nod].end() ; it++)
			if(!viz[*it] && c[nod][*it] > f[nod][*it])
			{
				Q.push(*it);
				tata[*it] = nod;
				if(*it == N)
					return 1;
			}
	}
	
	return 0;
}

void rezolva()
{
	while(bfs())
	{
		int minim = INF;
		for(int nod = N ; nod > 1 ; nod = tata[nod])
			minim = min(minim, c[tata[nod]][nod] - f[tata[nod]][nod]);
		flux += minim;
		for(int nod = N ; nod > 1 ; nod = tata[nod])
			f[tata[nod]][nod] += minim;
	}
}

int main()
{
	freopen("maxflow.in","r",stdin);
	freopen("maxflow.out","w",stdout);
	citeste();
	rezolva();
	printf("%d\n",flux);
	return 0;
	
}