Cod sursa(job #2579569)

Utilizator CyborgSquirrelJardan Andrei CyborgSquirrel Data 12 martie 2020 16:53:47
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 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])continue;
			
			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])continue;
			
			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)continue;
			
			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;
}