Cod sursa(job #2562481)

Utilizator aZvezdaAtanas Dimitrov aZvezda Data 29 februarie 2020 14:53:10
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.17 kb
#include <bits/stdc++.h>
using namespace std;
//#pragma GCC optimize ("O3")
//#pragma GCC target ("sse4")
#define endl "\n"
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
template<class T, class T2> inline bool chkmax(T &x, const T2 &y) { return x < y ? x = y, 1 : 0; }
template<class T, class T2> inline bool chkmin(T &x, const T2 &y) { return x > y ? x = y, 1 : 0; }
const ll mod = 1e9 + 7;

struct Edge {
	int to, f, cap;
	Edge() {}
	Edge(int _to, int _f, int _cap) {to = _to; f = _f; cap = _cap;}
};

const int MAX_N = 1e4 + 10;

struct FlowNetwork {
	vector<Edge> edges; 
	vector<int> g[MAX_N];
	void add(int a, int b, int c) {
		cout << a << " " << b << " " << c << endl;
		g[a].push_back(edges.size());		
		edges.emplace_back(b, 0, c);
		g[b].push_back(edges.size());		
		edges.emplace_back(a, 0, 0);
	}
	int s, t;
	int pind[MAX_N], dist[MAX_N];
	bool bfs() {
		for(int i = 0; i < MAX_N; i ++) {dist[i] = mod; pind[i] = 0;}
		dist[s] = 0;
		queue<int> q; q.push(s);
		while(!q.empty()) {
			int curr = q.front(); q.pop();
			for(auto it : g[curr]) {
				if(edges[it].f < edges[it].cap && dist[edges[it].to] == mod) {
					dist[edges[it].to] = dist[curr] + 1;
					q.push(edges[it].to);
				}
			}
		}
		return dist[t] != mod;
		
	}
	int dfs(int x, int val) {
		if(x == t || val == 0) {return val;}
		for(; pind[x] < g[x].size();) {
			int curr = g[x][pind[x] ++];
			if(dist[x] + 1 != dist[edges[curr].to] || edges[curr].f >= edges[curr].cap) {continue;}
			int now = dfs(edges[curr].to, min(edges[curr].cap - edges[curr].f, val));
			if(now == 0) {continue;}
			edges[curr].f += now;
			edges[curr ^ 1].f -= now;
			return now;
		}
		return 0;
	}
	int maxFlow() {
		int ans = 0;
		while(true) {
			if(!bfs()) {return ans;}
			int now = 0;
			while(now = dfs(s, mod)) {
				ans += now;
			}
		}
		return ans;
	}
};

FlowNetwork fn;


int main() {
    ofstream myfile;
    myfile.open ("maxflow.out");
    ifstream myFileIn;
    myFileIn.open ("maxflow.in");
    ll n, m;
    myFileIn >> n >> m;
    fn.s = 1;
    fn.t = n;
    for(ll i = 0; i < m; i ++) {
        ll a, b, cap;
        myFileIn >> a >> b >> cap;
        fn.add(a, b, cap);
    }	
    myfile << fn.maxFlow() << endl;
}