Cod sursa(job #2284866)

Utilizator theodor.moroianuTheodor Moroianu theodor.moroianu Data 17 noiembrie 2018 18:22:02
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.83 kb
#include <bits/stdc++.h>
using namespace std;

const int DIM_MAX = 1010;

namespace Flow {
	struct Edge {
		int from, to, cap;
	};
	vector <Edge> edges;
	vector <int> adia[DIM_MAX];
	int viz[DIM_MAX];
	int s, d, c, n, t;


	bool dfs(int nod) {
		viz[nod] = t;
		if (nod == d)
			return true;
		for (auto i : adia[nod]) {
			if (edges[i].cap >= c && viz[edges[i].to] < t && dfs(edges[i].to)) {
				edges[i].cap -= c;
				edges[i ^ 1].cap += c;
				return true;
			}
		}
		return false;
	}
	void add_edge(int from, int to, int cap) {
		adia[from].push_back(edges.size());
		edges.push_back({ from, to, cap });
		adia[to].push_back(edges.size());
		edges.push_back({ to, from, 0 });
	}
	inline int max_flow(int _s, int _d) {
		s = _s, d = _d;
		int flow = 0;
		for (c = 110000; c; ) {
			t++;
			if (dfs(s))
				flow += c;
			else
				c /= 2;
		}
		return flow;
	}
}


class InputReader {
public:
	InputReader() {}
	InputReader(const char *file_name) {
		input_file = fopen(file_name, "r");
		cursor = 0;
		fread(buffer, SIZE, 1, input_file);
	}
	inline InputReader &operator >>(int &n) {
		while (buffer[cursor] < '0' || buffer[cursor] > '9') {
			advance();
		}
		n = 0;
		while ('0' <= buffer[cursor] && buffer[cursor] <= '9') {
			n = n * 10 + buffer[cursor] - '0';
			advance();
		}
		return *this;
	}
private:
	FILE *input_file;
	static const int SIZE = 1 << 17;
	int cursor;
	char buffer[SIZE];
	inline void advance() {
		++cursor;
		if (cursor == SIZE) {
			cursor = 0;
			fread(buffer, SIZE, 1, input_file);
		}
	}
};

int main()

{

	InputReader in("maxflow.in");

	ofstream out("maxflow.out");

	int n, m, a, b, c;

	in >> n >> m;

	while (m--) {

		in >> a >> b >> c;

		Flow::add_edge(a, b, c);

	}



	out << Flow::max_flow(1, n) << '\n';



	return 0;

}