Cod sursa(job #668362)

Utilizator attila3453Geiszt Attila attila3453 Data 24 ianuarie 2012 19:47:31
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <stdio.h>
#include <vector>
#include <queue>

#define MAXNODURI 1000

using namespace std;

int nrnoduri, nrmuchii, source, sink;
int capacitati[MAXNODURI][MAXNODURI], 
	flow[MAXNODURI][MAXNODURI], 
	tata[MAXNODURI];
vector<int> *vecini;
int start, end, capacitate, i, j, sol;

bool parcurge()
{
	vector<bool> viz(nrnoduri + 1, 0);
	queue<int> coada;
	
	coada.push(source);
	viz[source] = true;
	
	while(!coada.empty())
	{
		start = coada.front();
		
		if(start != sink)
			for(i = 0;i < (signed)vecini[start].size();i++)
			{
				end = vecini[start][i];
				
				if(!viz[end] && flow[start][end] < capacitati[start][end])
				{
					viz[end] = true;
					tata[end] = start;
					coada.push(end);
				}
			}
		
		coada.pop();
	}
	
	return viz[sink];
}

int main()
{
	freopen("maxflow.in", "r", stdin);
	freopen("maxflow.out", "w", stdout);
	
	scanf("%d %d", &nrnoduri, &nrmuchii);
	vecini = new std::vector<int>[nrnoduri+1];
	
	for(i = 0;i < nrmuchii;i++)
	{
		scanf("%d %d %d", &start, &end, &capacitate);
		capacitati[start][end] += capacitate;
		vecini[start].push_back(end);
		vecini[end].push_back(start);//necesar?
	}
	
	source = 1;
	sink = nrnoduri;
	
	while(parcurge())
	{
		for(i = source;i < nrnoduri;i++)
			if(tata[i] && flow[i][sink] < capacitati[i][sink])
			{
				int Min = capacitati[i][sink] - flow[i][sink];
				
				for(j = i;j != source;j = tata[j])
					Min = min(Min, capacitati[tata[j]][j] - flow[tata[j]][j]);
				
				if(Min)//daca e 0 inseamna ca am gasit deja drum pe acolo
				{
					flow[i][sink] += Min;
					flow[sink][i] -= Min;
					
					for(j = i;j != source;j = tata[j])
					{
						flow[tata[j]][j] += Min;
						flow[j][tata[j]] -= Min;
					}
					
					sol += Min;
				}
			}
	}
	
	printf("%d", sol);
}