Cod sursa(job #2636808)

Utilizator irimia_alexIrimia Alex irimia_alex Data 20 iulie 2020 00:21:07
Problema Flux maxim Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <queue>
#include<cstring>
#define NMAX 1005
#define INF 100000000

using namespace std;

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

int G[NMAX][NMAX] = { 0 };
int n, m;

bool bfs(int G[][NMAX], int n, int source, int sink, int* parent) {
	bool viz[NMAX] = { 0 };
	queue<int> q;
	viz[source] = true;
	parent[source] = -1;
	q.push(source);

	while (!q.empty()) {
		int u = q.front();
		q.pop();
		
		if (u == sink)
			return true;

		for (int v = 1;v <= n;++v)
			if (!viz[v] && G[u][v] > 0) {
				q.push(v);
				parent[v] = u;
				viz[v] = true;
			}
	}

	return false;
}

void maximum_flow(int G[][NMAX], int n, int source, int sink) {
	int g[NMAX][NMAX] = { 0 };
	for (int i = 1;i <= n;++i)
		for (int j = 1;j <= n;++j)
			if (G[i][j] > 0) {
				g[i][j] = G[i][j];
			}
	int max_flow = 0;
	int parent[NMAX];
	while (bfs(g, n, source, sink, parent)) {
		int flow = INF;
		for (int v = sink;v != source;v = parent[v]) {
			int u = parent[v];
			if (g[u][v] < flow) flow = g[u][v];
		}

		for (int v = sink;v != source;v = parent[v]) {
			int u = parent[v];
			g[u][v] -= flow;
			g[v][u] += flow;
		}
		
		max_flow += flow;
	}

	fout << max_flow << '\n';

}

int main() {
	std::ios::sync_with_stdio(false);

	fin >> n >> m;
	while (m--) {
		int x, y, c;
		fin >> x >> y >> c;
		G[x][y] = c;
	}

	maximum_flow(G, n, 1, n);

	return 0;
}