Cod sursa(job #1394490)

Utilizator vladrochianVlad Rochian vladrochian Data 20 martie 2015 12:50:25
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;

const int kMaxN = 1005;
const int kInf = 0x3f3f3f3f;

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

int N, M, cap[kMaxN][kMaxN], padre[kMaxN], maxflow;
vector<int> G[kMaxN];
bool use[kMaxN];

void DFS(int node) {
	use[node] = true;
	if (node != N)
		for (int i : G[node])
			if (!use[i] && cap[node][i]) {
				padre[i] = node;
				DFS(i);
			}
}

bool Check() {
	memset(use, 0, sizeof use);
	DFS(1);
	return use[N];
}

int main() {
	fin >> N >> M;
	while (M--) {
		int x, y, c;
		fin >> x >> y >> c;
		G[x].push_back(y);
		G[y].push_back(x);
		cap[x][y] = c;
	}
	while (Check()) {
		for (int node : G[N])
			if (use[node] && cap[node][N]) {
				padre[N] = node;
				int flow = kInf;
				for (int i = N; i != 1; i = padre[i])
					flow = min(flow, cap[padre[i]][i]);
				for (int i = N; i != 1; i = padre[i]) {
					cap[padre[i]][i] -= flow;
					cap[i][padre[i]] += flow;
				}
				maxflow += flow;
			}
	}
	fout << maxflow << "\n";
	return 0;
}