Cod sursa(job #1738108)

Utilizator Bulgaru_Robert_Razvan_323CBBulgaru Robert Razvan Bulgaru_Robert_Razvan_323CB Data 5 august 2016 18:31:08
Problema Flux maxim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <climits>
#include <queue>
#include <vector>
#include <algorithm>

using namespace std;

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

vector<int> graph[1010];
queue<int> q;

int c[1010][1010];
int f[1010][1010];
int seen[1010];
int parent[10];
int n,m,x,y,z,s,d,fMax;

int BFS(int s,int d) {
	unsigned int node;

	memset(seen,0,sizeof(seen));
	memset(parent,0,sizeof(parent));

	q.push(s);
	seen[s]=1;

	while (!q.empty()) {
		node=q.front();
		//q.pop();
		for (unsigned int i=0;i<graph[node].size();i++) {
			if (!seen[graph[node][i]] && c[node][graph[node][i]]>f[node][graph[node][i]]) {
				seen[graph[node][i]]=1;
				parent[graph[node][i]]=node;
				if (d!=graph[node][i])
					q.push(graph[node][i]);
			}
		}

		q.pop();
	}

	return seen[d];
}

void EdmondsKarp(int s,int d) {
	unsigned int node;

	int flow;
	while (BFS(s,d)) {
		for (unsigned int i=0;i<graph[d].size();i++) {
			if (seen[graph[d][i]] && c[graph[d][i]][d]>f[graph[d][i]][d]) {
				parent[d]=graph[d][i];

				flow=INT_MAX;
				for (node=d;node!=s;node=parent[node]) {
					if ((c[parent[node]][node]-f[parent[node]][node])<flow)
						flow=c[parent[node]][node]-f[parent[node]][node];
				}

				fMax+=flow;
				for (node=d;node!=s;node=parent[node]) {
					f[parent[node]][node]+=flow;
					f[node][parent[node]]-=flow;
				}
			}
		}
 	}
} 

int main() {
	in>>n>>m;
	
	for (int i=1;i<=m;i++) {
		in>>x>>y>>z;
		graph[x].push_back(y);
		graph[y].push_back(x);
		c[x][y]=z;
	}

	EdmondsKarp(1,n);

	out<<fMax;

	return 0;
}