Cod sursa(job #2383761)

Utilizator VadimCCurca Vadim VadimC Data 19 martie 2019 19:33:23
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

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

#define NMax 1010
#define MMax 5010
const int inf = (1 << 30) - 1;

int n, m;
int C[NMax][NMax], F[NMax][NMax];
vector<int> G[NMax];
int viz[NMax];

void citire();
void rezolvare();
bool bfs();

int main(){
	citire();
	rezolvare();
}

void citire(){
	int i;
	int x, y, z;
	fin >> n >> m;
	for(i = 0; i < m; i++){
		fin >> x >> y >> z;
		C[x][y] = z;
		G[x].push_back(y);
		G[y].push_back(x);
	}
}

void rezolvare(){
	int i, j, flux, fmin, x;
	for(flux = 0; bfs();){
		
		for(i = 0; i < G[n].size(); i++){
			x = G[n][i];
			if(!viz[x] || C[x][n] == F[x][n]) continue;
			viz[n] = x;
			fmin = inf;
			for(x = n; x != 1; x = viz[x])
				fmin = min(fmin, C[viz[x]][x] - F[viz[x]][x]);
			if(fmin == 0) continue;
			for(x = n; x != 1; x = viz[x]){
				F[viz[x]][x] += fmin;
				F[x][viz[x]] -= fmin;
			}
			flux += fmin;
		}
	}
	
	fout << flux;
}

bool bfs(){
	int i, x;
	queue<int> q;
	for(i = 1; i <= n; i++) viz[i] = 0;
	q.push(1);
	viz[1] = 1;
	while(q.size()){
		x = q.front(); q.pop();
		if(x == n) continue;
		for(i = 0; i < G[x].size(); i++)
			if(!viz[G[x][i]] && C[x][G[x][i]] > F[x][G[x][i]]){
				viz[G[x][i]] = x;
				q.push(G[x][i]);
			}
	}
	return viz[n];
}