Cod sursa(job #1512112)

Utilizator pas.andreiPopovici Andrei-Sorin pas.andrei Data 27 octombrie 2015 18:31:46
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <iostream>
#include <queue>
#include <vector>
#include <fstream>
#include <algorithm>
#include <string>
#include <iomanip>
#include <cstring>
#include <cstdio>
#include <map>
#define MOD 1000000007
#define INF_MIN -2147483647
#define ll long long
#define NMAX 1005

using namespace std;

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

int C[NMAX][NMAX], F[NMAX][NMAX];
int Prev[NMAX];
bool viz[NMAX];
vector<int> v[NMAX];
int n;

int BFS();

int main() {
	int m, i, j, x, y, c, flux, f, p, nod;

	fin >> n >> m;
	for (i = 0; i < m; ++i) {
		fin >> x >> y >> c;

		C[x][y] = c;
		v[x].push_back(y);
		v[y].push_back(x);
	}

	flux = 0;
	while (BFS() == 1) {
		for (i = 0; i < v[n].size(); ++i) {
			nod = v[n][i];

			if (F[nod][n] < C[nod][n] && viz[nod]) {
				Prev[n] = nod;
				p = n;
				f = 1000000000;
				while (p != 1) {
					f = min(f, C[Prev[p]][p] - F[Prev[p]][p]);
					p = Prev[p];
				}

				if (f>0) {
					p = n;
					while (p != 1) {
						F[Prev[p]][p] += f;
						F[p][Prev[p]] -= f;
						p = Prev[p];
					}
				}
				
				flux += f;
			}
		}
	}

	fout << flux;

	return 0;
}

int BFS() {
	int i, j, nod, x;
	queue<int> Q;

	Q.push(1);
	memset(viz, false, sizeof(viz));
	while (!Q.empty()) {
		nod = Q.front();
		Q.pop();

		if (nod != n) {
			for (i = 0; i < v[nod].size(); ++i) {
				x = v[nod][i];

				if (viz[x] == false && C[nod][x] != F[nod][x]) {
					viz[x] = true;
					Q.push(x);
					Prev[x] = nod;
				}
			}
		}
	}

	return viz[n];
}