Cod sursa(job #1262740)

Utilizator Sanduleac_VladSanduleac Vllad Alexandru Sanduleac_Vlad Data 13 noiembrie 2014 15:19:40
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <cstdio>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;

long N, M;
long cap[1001][1001];
vector<long> ad[1001]; // adiacente
long a, b, c;
long viz[1001]; // contine de unde vine
long rez, minc;
queue<long> q, m;

bool bfs() {
	long i, j, crt;
	q.push(1);
	m.push(111000);
	while(!q.empty()) {
		crt = q.front();
		if(crt == N) {
			rez += m.front();
			minc = m.front();
			while(!q.empty()) {
				q.pop();
				m.pop();
			}
			return true;
		}
		for(i = 0; i < ad[crt].size(); i++)
			if(cap[crt][ad[crt][i]] > 0 && !viz[ad[crt][i]]) {
				if(m.front() > cap[crt][ad[crt][i]])
					m.push(cap[crt][ad[crt][i]]);
				else m.push(m.front());
				q.push(ad[crt][i]);
				viz[ad[crt][i]] = crt;
			}
		q.pop();
		m.pop();
	}
	return false;
}

int main() {
	long i, j;
	freopen("maxflow.in", "r", stdin);
	freopen("maxflow.out", "w", stdout);
	scanf("%ld %ld", &N, &M);
	for(i = 1; i <= M; i++) {
		scanf("%ld %ld %ld", &a, &b, &c);
		cap[a][b] = c;
		ad[a].push_back(b);
		ad[b].push_back(a);
	}
	while(bfs()) {
		long i;
		i = N;
		while(i != 1) {
			cap[i][viz[i]] += minc;
			cap[viz[i]][i] -= minc;
			i = viz[i];
		}
		memset(viz, 0, sizeof(viz));
	}
	printf("%ld\n", rez);
	return 0;
}