Cod sursa(job #2402729)

Utilizator CojocariuAlexandruCojocariu Alexandru CojocariuAlexandru Data 10 aprilie 2019 23:01:48
Problema Flux maxim Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <cstdio>
#define NMAX 1005
#define INF 999999999

using namespace std;

FILE *fin = fopen("maxflow.in", "r");
FILE *fout = fopen("maxflow.out", "w");

int GRezid[NMAX][NMAX];
int vizited[NMAX], parent[NMAX];
int n, m, i, x, y, cost, maxFlow, minim;

int BFS();

int main()
{
	ios_base::sync_with_stdio(false);
	fscanf(fin, "%d%d", &n, &m);
	for (i = 1; i <= m; ++i) {
		fscanf(fin, "%d%d%d", &x, &y, &cost);
		GRezid[x][y] = cost;
		}
	while (BFS() == 1) {
		minim = INF;
		for (i = n; parent[i] != -1; i = parent[i]) {
			if (GRezid[parent[i]][i] < minim)
				minim = GRezid[parent[i]][i];
			}
		for (i = n; parent[i] != -1; i = parent[i]) {
			GRezid[parent[i]][i] -= minim;
			GRezid[i][parent[i]] += minim;
			}
		maxFlow += minim;
		for (i = 1; i <=n; ++i)
			vizited[i] = 0;
		}
	fprintf(fout, "%d", maxFlow);
    return 0;
}

int BFS() {
	int val;
	queue<int> q;
	q.push(1);
	vizited[1] = 1;
	parent[1] = -1;
	while (!q.empty()) {
		val = q.front();
		q.pop();
		for (i = 1; i <= n; ++i) {
			if (GRezid[val][i] > 0 && vizited[i] == 0) {
				parent[i] = val;
				vizited[i] = 1;
				q.push(i);
				}
			}
		}
	if (vizited[n] == 1)
		return 1;
	return 0;
}