Cod sursa(job #1509518)

Utilizator al.mocanuAlexandru Mocanu al.mocanu Data 24 octombrie 2015 00:02:10
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <stdio.h>
#include <string.h>
#include <queue>
#include <vector>
#define MAX 1005
#define INF 1<<30
#define max(a, b) (((a) < (b)) ? (b) : (a))
using namespace std;

int n, m, x, y, z, i, C[MAX][MAX], F[MAX][MAX], path[MAX], flux;
vector<int> l[MAX];
bool viz[MAX];

bool bfs(){
	viz[1] = 1;
	memset(viz + 2, 0, n - 1);
	queue<int> q;
	q.push(1);

	while(!q.empty()){
		int aux = q.front();
		q.pop();
		if(aux != n)
			for(int i = 0; i < l[aux].size(); i++)
				if(C[aux][l[aux][i]] != F[aux][l[aux][i]] && !viz[l[aux][i]]){
					path[l[aux][i]] = aux;
					viz[l[aux][i]] = 1;
					q.push(l[aux][i]);
				}
	}
	return viz[n];
}

int main(){
	freopen("maxflow.in", "r", stdin);
	freopen("maxflow.out", "w", stdout);
	scanf("%d%d", &n, &m);
	for(i = 0; i < m; i++){
		scanf("%d%d%d", &x, &y, &z);
		l[x].push_back(y);
		l[y].push_back(x);
		C[x][y] = z;
	}

	while(bfs())
		for(int i = 0; i < l[n].size(); i++){
			if(viz[l[n][i]] && C[l[n][i]][n] != F[l[n][i]][n]){
				path[n] = l[n][i];
				int u = n, minim = INF;
				while(u != 1){
					int v = path[u];
					minim = min(minim, C[v][u] - F[v][u]);
					u = v;
				}
				flux += minim;
				u = n;
				while(u != 1){
					int v = path[u];
					F[v][u] += minim;
					F[u][v] -= minim;
					u = v;
				}
			}
		}
	printf("%d\n", flux);
	return 0;
}