Cod sursa(job #1182779)

Utilizator krityxAdrian Buzea krityx Data 7 mai 2014 17:12:11
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

#define MAXN 1000
#define INF 999999

using namespace std;

int capacitate[MAXN][MAXN], flux[MAXN][MAXN], viz[MAXN], parinte[MAXN], s, d;
vector<int> G[MAXN];
queue<int> Q;

int bfs(int sursa, int dest)
{
	int i, nod;
	for (i = 0; i < MAXN; i++)
	{
		viz[i] = 0;
	}
	Q.push(sursa);
	while (!Q.empty())
	{
		nod = Q.front();
		Q.pop();
		for (vector<int>::iterator it = G[nod].begin(); it != G[nod].end(); it++)
		{
			if (!viz[*it] && (flux[nod][*it] != capacitate[nod][*it]))
			{
				parinte[*it] = nod;
				viz[*it] = 1;
				if (*it != dest)
				{
					Q.push(*it);
				}
			}
		}
	}
	return viz[dest];
}
int edmonds_karp()
{
	int maxflow = 0, minim, nod, cf;
	while (bfs(s, d) != 0)
	{
		for (vector<int>::iterator it = G[d].begin(); it != G[d].end(); it++)
		{
			parinte[d] = *it;
			if (viz[*it] && (flux[*it][d] != capacitate[*it][d]))
			{
				minim = INF;
				nod = d;
				while (nod != s)
				{
					cf = capacitate[parinte[nod]][nod] - flux[parinte[nod]][nod];
					if (cf < minim)
					{
						minim = cf;
					}
					nod = parinte[nod];
				}
				nod = d;
				while (nod != s)
				{
					flux[nod][parinte[nod]] -= minim;
					flux[parinte[nod]][nod] += minim;
					nod = parinte[nod];
				}
				maxflow += minim;
			}
		}
	}
	return maxflow;
}

int main()
{
	ifstream f("maxflow.in");
	ofstream g("maxflow.out");
	int n, m, i, x, y;
	f >> n >> m;
	for (i = 0; i < m; i++)
	{
		f >> x >> y;
		G[x].push_back(y);
		G[y].push_back(x);
		f >> capacitate[x][y];
	}
	s = 1; d = n;
	g << edmonds_karp();
	f.close();
	g.close();
	return 0;
}