Cod sursa(job #1510918)

Utilizator pas.andreiPopovici Andrei-Sorin pas.andrei Data 25 octombrie 2015 19:38:09
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <cstdio>
#include <iostream>
#include <queue>
#include <vector>
#include <fstream>
#include <algorithm>
#include <string>
#include <iomanip>
#include <cstring>
#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;

	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) {
		i = n;
		f = 1000000000;
		while (i != 1) {
			f = min(f, C[Prev[i]][i] - F[Prev[i]][i]);
			i = Prev[i];
		}

		i = n;
		while (i != 1) {
			F[Prev[i]][i] += f;
			F[i][Prev[i]] -= f;
			i = Prev[i];
		}

		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();

		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;

				if (x == n)
					return 1;
			}
		}
	}

	return 0;
}