Cod sursa(job #1460834)

Utilizator LegionHagiu Stefan Legion Data 14 iulie 2015 01:39:14
Problema Flux maxim Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2.29 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
vector<pair<pair<int, int>, int> > nod[1001];
int vizitat[1001];
int fluxm = 0;
int n;
struct el
{
	int care;
	int delacine;
	int cat;
	int alcateleainlista;
	int folosit;
};
void baga(int c)
{
	int i,j,gata,k,primesc;
	vizitat[1] = c;
	el a;
	a.care = 1;
	a.delacine = -1;
	a.cat = 9999999;
	a.folosit = 0;
	a.alcateleainlista = 0;
	vector<el> coada;
	coada.push_back(a);
	for (i = 0; i < coada.size(); i++)
	{
		gata = 0;
		for (j = 0; j < nod[coada[i].care].size(); j++)
		{
			if (nod[coada[i].care][j].first.first == n&&nod[coada[i].care][j].first.second>0)
			{
				gata = 1;
				k = i;
				primesc = 99999999;
				while (k != 0)
				{
					primesc = min(primesc, nod[coada[coada[k].delacine].care][coada[k].alcateleainlista].first.second);
					k = coada[k].delacine;
				}
				if (primesc <= 0)
				{
					gata = 1;
					break;
				}
				k = i;
				fluxm += primesc;
				nod[coada[i].care][j].first.second -= primesc;
				nod[n][nod[coada[i].care][j].second].first.second += primesc;
				while (k > 0)
				{
					nod[coada[coada[k].delacine].care][coada[k].alcateleainlista].first.second -= primesc;
					nod[coada[k].care][nod[coada[coada[k].delacine].care][coada[k].alcateleainlista].second].first.second += primesc;
					k = coada[k].delacine;
				}
				break;
			}
		}
		if (gata == 1){ continue; }
		for (j = 0; j < nod[coada[i].care].size(); j++)
		{
			if (vizitat[nod[coada[i].care][j].first.first] != c&&nod[coada[i].care][j].first.second>0)
			{
				vizitat[nod[coada[i].care][j].first.first] = c;
				a.care = nod[coada[i].care][j].first.first;
				a.delacine = i;
				a.cat = min(coada[i].cat, nod[coada[i].care][j].first.second);
				a.alcateleainlista = j;
				coada.push_back(a);
			}
		}
	}
}
void flux()
{
	int i;
	int acum=-1;
	for (i = 1; fluxm > acum; i++)
	{
		acum = fluxm;
		baga(i);
	}
}
int main()
{
	ifstream in("maxflow.in");
	ofstream out("maxflow.out");
	int i,m,x,y,z;
	in >> n;
	in >> m;
	for (i = 1; i <= m; i++)
	{
		in >> x;
		in >> y;
		in >> z;
		nod[x].push_back(make_pair(make_pair(y, z),nod[y].size()));
		nod[y].push_back(make_pair(make_pair(x, 0), nod[x].size() - 1));
	}
	flux();
	out << fluxm;
}