Cod sursa(job #592079)

Utilizator darrenRares Buhai darren Data 26 mai 2011 18:24:26
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <cstring>
#include <fstream>
#include <algorithm>
#include <queue>
#include <vector>

using namespace std;

const int INF = 1LL << 31 - 1;
const int SIZE = 1001;

bool bfs();
void dim();

int n, m, maxflow;
int c[SIZE][SIZE], f[SIZE][SIZE], t[SIZE];
bool s[SIZE];
vector<int> v;

int main()
{
	ifstream fin("maxflow.in");
	ofstream fout("maxflow.out");

	fin >> n >> m;
	for (int i = 1, nod1, nod2, cap; i <= m;  ++i)
	{
		fin >> nod1 >> nod2 >> cap;
		c[nod1][nod2] = cap;
	}

	while (bfs())
		dim();

	fout << maxflow;
}

bool bfs()
{
	queue<int> q;

    v.clear();
	memset(t, 0, sizeof(t));
	memset(s, 0, sizeof(s));

	q.push(1);
	s[1] = true;

	while (!q.empty())
	{
		int i = q.front(); q.pop();

		if (f[i][n] < c[i][n])
		{
		    v.push_back(i);
		    continue;
		}

		for (int j = 1; j <= n; ++j)
			if (!s[j])
				if (f[i][j] < c[i][j])
				{
					t[j] = i, s[j] = true;
					q.push(j);
				}
	}

    if (!v.empty()) return true;
	return false;
}

void dim()
{
    while (!v.empty())
    {
        int i = v.back(), crnow = c[i][n] - f[i][n];
        while (i != 1)
        {
            crnow = min(crnow, c[t[i]][i] - f[t[i]][i]);
            i = t[i];
        }

        i = v.back();

        f[i][n] += crnow;
        f[n][i] -= crnow;

        while (i != 1)
        {
            f[t[i]][i] += crnow;
            f[i][t[i]] -= crnow;
            i = t[i];
        }

        maxflow += crnow;

        v.pop_back();
    }
}