Cod sursa(job #2636810)

Utilizator irimia_alexIrimia Alex irimia_alex Data 20 iulie 2020 00:49:02
Problema Flux maxim Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <queue>
#include<cstring>
#define NMAX 100
#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) {
	queue<int> q;
	viz[source] = true;
	parent[source] = -1;
	q.push(source);

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

		if (u == sink) continue;

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

	return (viz[sink]==true);
}

void maximum_flow(int G[][NMAX], int n, int source, int sink) {
	int g[NMAX][NMAX] = { 0 };
	bool viz[NMAX] = { 0 };
	for (int i = 1;i <= n;++i)
		for (int j = 1;j <= n;++j)
			g[i][j] = G[i][j];
	int max_flow = 0;
	int parent[NMAX];
	while (bfs(g, n, source, sink, parent, viz)) {
		for(int i=1;i<=n;++i)
			if (g[i][sink] > 0 && viz[i]) {
				parent[sink] = i;
				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;
			}
		memset(viz, false, sizeof(viz));
	}

	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;
}