Cod sursa(job #1700719)

Utilizator mihai995mihai995 mihai995 Data 11 mai 2016 04:47:12
Problema Flux maxim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>
#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;

const int N = 1001, inf = 0x3f3f3f3f;

vector<int> graph[N]; //bidirectional
int cap[N][N], diff[N][N], T[N], n;

bool bfs(int x, int D){
	memset(T, -1, sizeof(T));
	queue<int> Q;
	Q.push(x);

	while ( !Q.empty() ){
		x = Q.front();
		Q.pop();

		for ( int y : graph[x] )
			if ( diff[x][y] && T[y] == -1 ){
				T[y] = x;
				Q.push(y);
			}
	}
	return T[D] != -1;
}

inline int getFlow(int x, int y){
	return cap[x][y] - diff[x][y];
}
int maxflow(int S, int D){
	memcpy( diff, cap, sizeof(cap) );
	int tot = 0;
	while ( bfs(S, D) ) for (int d : graph[D]) {
		int F = inf; T[D] = d;
		for (int i = D; i != S; i = T[i])
			F = min( F, diff[ T[i] ][i] );
		for (int i = D; i != S; i = T[i]){
			diff[ T[i] ][i] -= F;
			diff[i][ T[i] ] += F;
		}
		tot += F;
	}
	return tot; //actual flow(x, y) = cap[x][y] - flow[x][y];
}

int main(){
	ifstream in("maxflow.in");
	ofstream out("maxflow.out");
	int m, x, y;

	in >> n >> m;
	while (m--){
		in >> x >> y;
		in >> cap[x][y];
		graph[x].push_back(y);
		graph[y].push_back(x);
	}
	out << maxflow(1, n) << '\n';
	return 0;
}