Cod sursa(job #1829833)

Utilizator grimmerFlorescu Luca grimmer Data 15 decembrie 2016 18:18:38
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;

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

const int NMAX = 1005;
const int Min_Val = 0x3f3f3f3f;
int n, m, cap[NMAX + 5][NMAX + 5], parent[NMAX + 5], viz[NMAX + 5];
vector<int> G[NMAX + 5];

bool BFS(){
	int i, node, nxt_node;
	memset(viz, 0, sizeof viz);
	queue<int>q;
	q.push(1);
	viz[1] = true;

	while(!q.empty()){
		node = q.front();
		q.pop();

		if(node != n){
			for(i = 0; i < (int)G[node].size(); ++i){
				nxt_node = G[node][i];

				if(!viz[nxt_node] && cap[node][nxt_node]){
					q.push(nxt_node);
					parent[nxt_node] = node;
					viz[nxt_node] = true;
				}

			}
		}

	}

	return viz[n];
}

int main()
{
	int i, x, y, c, flow = 0, flowmin = Min_Val, curr_node, j;

	fin>>n>>m;

	for(i = 1; i <= m; ++i){

		fin>>x>>y>>c;
		G[x].push_back(y);
		G[y].push_back(x);
		cap[x][y] = c;

	}

	while(BFS()){

		for(j = 0; j < (int)G[n].size(); ++j){

			curr_node = G[n][j];

			if(viz[curr_node] && cap[curr_node][n]){

				parent[n] = curr_node;
				flowmin = Min_Val;

				for(i = n; i != 1; i = parent[i]){
					flowmin = min(flowmin, cap[parent[i]][i]);
				}

				for(i = n; i != 1; i = parent[i]){
					cap[parent[i]][i] -= flowmin;
					cap[i][parent[i]] += flowmin;
				}

				flow += flowmin;
			}

		}

	}

	fout<<flow;
    return 0;
}