Cod sursa(job #2579567)

Utilizator CyborgSquirrelJardan Andrei CyborgSquirrel Data 12 martie 2020 16:52:28
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>

using namespace std;

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

const int INF = 0x3f3f3f3f;

int cap[1041][1041];
int flo[1041][1041];

vector<int> gra[1041];

int n, m;
void read(){
	fin >> n >> m;
	for(int i = 0; i < m; ++i){
		int a, b, v;
		fin >> a >> b >> v;
		cap[a][b] = v;
		gra[a].push_back(b);
		gra[b].push_back(a);
	}
}

int dad[1041];
bitset<1041> vi;
queue<int> qu;
bool bfs(){
	vi.reset();
	qu.push(1);
	vi[1] = true;
	while(!qu.empty()){
		int a = qu.front();
		qu.pop();
		for(auto b : gra[a]){
			if(!vi[b] && cap[a][b] != flo[a][b]){
				dad[b] = a;
				vi[b] = true;
				if(b != n)qu.push(b);
			}
		}
	}
	return vi[n];
}

int flow = 0;
void solve(){
	while(bfs()){
		for(auto a : gra[n]){
			if(vi[a] && cap[a][n] != flo[a][n]){
				int fmin = INF;
				dad[n] = a;
				for(int x = n; x > 1; x = dad[x]){
					fmin = min(fmin, cap[dad[x]][x] - flo[dad[x]][x]);
				}
				if(fmin != 0){
					for(int x = n; x > 1; x = dad[x]){
						flo[dad[x]][x] += fmin;
						flo[x][dad[x]] -= fmin;
					}
					flow += fmin;
				}
			}
		}
	}
}

int main(){
	read();
	solve();
	fout << flow;
	return 0;
}