Cod sursa(job #1117726)

Utilizator cernat.catallinFMI Cernat Catalin Stefan cernat.catallin Data 23 februarie 2014 19:17:13
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <stdio.h>
#include <vector>
#include <queue>
using namespace std;

#define Nmax 1005

vector <int> graph[Nmax];
int c[Nmax][Nmax], f[Nmax][Nmax];
int father[Nmax];
int n, m, s, t, flow;

void read(){
	freopen("maxflow.in", "r", stdin);
	int u, v, cc;

	scanf("%d %d", &n, &m);
	for (int i = 1; i <= m; ++i){
		scanf("%d %d %d", &u, &v, &cc);
		c[u][v] = cc;
		graph[u].push_back(v);
		graph[v].push_back(u);
	}
	s = 1;
	t = n;
	fclose(stdin);
}

inline int min(int a, int b){
	if (a < b)
		return a;
	return b;
}

inline int bfs(){
	queue <int> q;
	vector <int>::iterator it;
	int u;

	for (int i = 1; i <= n; ++i)
		father[i] = -1;
	q.push(s);

	while ( !q.empty() ){
		u = q.front();
		q.pop();
		for (it = graph[u].begin(); it != graph[u].end(); ++it)
			if (father[*it] == -1 && c[u][*it] != f[u][*it]){
				father[*it] = u;
				q.push(*it);
			}
	}
	if (father[t] != -1)
		return 1;
	return 0;
}

void dinic(){
	vector <int>::iterator it;
	int f_min;

	while ( bfs() ){
		for (it = graph[t].begin(); it != graph[t].end(); ++it)
			if (father[*it] != -1 && c[*it][t] != f[*it][t]){
				f_min = c[*it][t] - f[*it][t];
				for (int i = *it; i != s; i = father[i])
					f_min = min(f_min, c[ father[i] ][i] - f[ father[i] ][i]);

				f[*it][t] += f_min;
				f[t][*it] -= f_min;
				for (int i = *it; i != s; i = father[i]){
					f[ father[i] ][i] += f_min;
					f[i][ father[i] ] -= f_min;
				}
				flow += f_min;
			}
	}
}

void write(){
	freopen("maxflow.out", "w", stdout);
	printf("%d\n", flow);
	fclose(stdout);
}

int main(){
	read();
    dinic();
    write();
}