Cod sursa(job #1222856)

Utilizator Luncasu_VictorVictor Luncasu Luncasu_Victor Data 24 august 2014 16:08:16
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <iostream>
#include <iomanip>
#include <fstream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
#define MAX 1010
#define INF 0xFFFFFF

vector<int> Graph[MAX];
queue<int> Q;
bool Use[MAX];
int N, M, Capacity[MAX][MAX], From[MAX], Flow[MAX][MAX], MaxFlow;

bool Bfs() {
	int X, Y;
	memset(Use, 0, sizeof(Use));
	Q.push(1);
	Use[1] = 1;
	while (Q.size()) {
		X = Q.front();
		Q.pop();
		if (X == N) continue;
		for (int i = 0; i < Graph[X].size(); i++){
			Y = Graph[X][i];
			if (!Use[Y] && Capacity[X][Y] > Flow[X][Y]) {
				Use[Y] = 1;
				From[Y] = X;
				Q.push(Y);
			}
		}
	}
	return Use[N];
}

int main() {
	int X, Y, Z;

	freopen("maxflow.in","r",stdin);
	freopen("maxflow.out","w",stdout);
	
	scanf("%d %d", &N, &M);
	for (int i = 1; i <= M; i++) {
		scanf("%d %d %d", &X, &Y, &Z);
		Graph[X].push_back(Y);
		Graph[Y].push_back(X);
		Capacity[X][Y] = Z;
	}
	
	while (Bfs()) {
		for (int i = 0; i < Graph[N].size(); i++) {
			Y = Graph[N][i];
			if (Use[Y] && Capacity[Y][N] > Flow[Y][N]) {
				From[N] = Y;
				Z = INF;
				for (X = N; X != 1; X = From[X]) {
					Z = min(Z, Capacity[From[X]][X] - Flow[From[X]][X]); 
				}
				if (Z != INF && Z > 0) {
					MaxFlow += Z;
					for (X = N; X != 1; X = From[X]) {
						Flow[From[X]][X] += Z;
						Flow[X][From[X]] -= Z;
					}
				}	 
			}
		}
	}
	printf("%d\n", MaxFlow);

	return 0;
}