Cod sursa(job #1808342)

Utilizator mateinMatei Nistor Ionut matein Data 17 noiembrie 2016 17:04:51
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.18 kb
#include <fstream>
#include <vector>
#include <utility>
#include <iostream>
#include <queue>

#define MAX_SIZE 110001
using namespace std;
int main() {
	ifstream in;
	ofstream out;
	in.open("maxflow.in");
	out.open("maxflow.out");
	int n, m, x, y, cap, fluxMax;
	
	queue<int> my_queue;
	vector<int> bfs;
	bool end;
	std::vector<int> visited(n + 1);
	int aux, capacity, flux, coloumn, line, min;
	

	in>>n>>m;
	vector< vector<pair <int, int> > > graph;
	for(int i = 0; i <= n; i++) {
		graph.push_back(vector<pair <int, int> > (n + 1));
	} 

	for(int i = 0; i < m; i++) {
		in>>x>>y>>cap;
		graph[x][y] = pair<int, int>(cap, 0);
	}


	fluxMax = 0;


	while(true) {

		while(!my_queue.empty()) {
			my_queue.pop();
		}
		my_queue.push(1);
		visited[1] = 1;
		end = false;

		while(!my_queue.empty() && !end) {
			aux = my_queue.front();
			my_queue.pop();	
			bfs.push_back(aux);
			for(int i = 1; i < n + 1; i++) {
				if(!visited[i]) {
					capacity = graph[aux][i].first;
					flux = graph[aux][i].second;
					if(flux < 0) {
						visited[i] = 1;
						my_queue.push(i);
						if(i == n) {
							end = true;
						}
					} else {
						if(capacity - flux > 0) {
							visited[i] = 1;
							my_queue.push(i);
							if(i == n) {
								end = true;
							}
						}
					}
				}
			}
		}

		if(end) {

			for(int i = 1; i <= n; i++) {
				visited[i] = 0;
			}

			bfs.push_back(n);
			min = MAX_SIZE;
			for(int i = 0; i < bfs.size() - 1; i++) {
				line = bfs[i];
				coloumn = bfs[i + 1];
				capacity = graph[line][coloumn].first;
				flux = graph[line][coloumn].second;
				if(flux < 0) {
					if(-flux < min) {
						min = -flux;
					}
				} else {
					if(capacity - flux > 0) {
						if(capacity - flux < min) {
							min = capacity - flux;
						}
					}
				}
			}

			for(int i = 0; i < bfs.size() - 1; i++) {
				line = bfs[i];
				coloumn = bfs[i + 1];
				graph[line][coloumn].second += min;
				graph[coloumn][line].second = -graph[line][coloumn].second;
			}

			fluxMax += min;
			bfs.clear();

		} else {

			out<<fluxMax<<'\n';
			break;
		}
	}

	


	/*for(int i = 1; i <= n; i++) {
		for(int j = 1; j <= n; j++) {
			cout<<graph[i][j].second<<' ';
		}
		cout<<'\n';
	}*/

	in.close();
	out.close();
	return 0;

}