Cod sursa(job #1172747)

Utilizator sorin2kSorin Nutu sorin2k Data 17 aprilie 2014 23:33:33
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
#include<fstream>
#include<vector>
#include<queue>
#include<bitset>
using namespace std;

ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

vector<int> adj[1000];
bitset<1000> viz;
queue<int> nodesCloseToSink;
int capacity[1000][1000], parent[1000];
int maximumFlow, n, m;

void bfs() {
	int current;
	queue<int> q;

	q.push(0);
	viz[0] = 1;
	parent[0] = 0;
	while(!q.empty()) {
		current = q.front();
		q.pop();
		for(vector<int>::iterator it = adj[current].begin(); it != adj[current].end(); ++it) {
			if(capacity[current][*it] > 0 && viz[*it] == 0) {
				if(*it != n-1) {
					q.push(*it);
					viz[*it] = 1;
					parent[*it] = current;
				} else {
					nodesCloseToSink.push(current);
				}
			}
		}
	}
}

void maxFlow() {
	bool finished = false;
	int current, min, auxCurrent;

	while(!finished) {
		viz.reset();
		bfs();
		if(nodesCloseToSink.size() == 0) {
			finished = true;
		} else {
			while(nodesCloseToSink.size() > 0) {
				current = nodesCloseToSink.front();
				nodesCloseToSink.pop();
				min = capacity[current][n-1];
				auxCurrent = current;
				while(auxCurrent != parent[auxCurrent]) {
					if(min > capacity[parent[auxCurrent]][auxCurrent]) {
						min = capacity[parent[auxCurrent]][auxCurrent];
					}
					auxCurrent = parent[auxCurrent];
				}
				auxCurrent = current;
				capacity[current][n-1] -= min;
				capacity[n-1][current] += min;
				while(auxCurrent != parent[auxCurrent]) {
					capacity[parent[auxCurrent]][auxCurrent] -= min;
					capacity[auxCurrent][parent[auxCurrent]] += min;
					auxCurrent = parent[auxCurrent];
				}
				maximumFlow += min;
			}
		}
	}
}

int main() {
	int i, u, v, c;

	fin >> n >> m;
	for(i = 0; i < m; i++) {
		fin >> u >> v >> c;
		u--, v--;
		adj[u].push_back(v);
		capacity[u][v] = c;
	}
	maxFlow();
	fout << maximumFlow;
	return 0;
}