Cod sursa(job #1738065)

Utilizator Bulgaru_Robert_Razvan_323CBBulgaru Robert Razvan Bulgaru_Robert_Razvan_323CB Data 5 august 2016 17:08:47
Problema Flux maxim Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 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[1005];
queue<int> q;

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

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

	q.push(s);

	memset(parent,-1,sizeof(parent));
	while (!q.empty()) {
		node=q.front();

		for (unsigned int i=0;i<graph[node].size();i++) {
			if ((c[node][graph[node][i]]-f[node][graph[node][i]])>0 && parent[graph[node][i]]==-1) {
				parent[graph[node][i]]=node;
				q.push(graph[node][i]);
			}
		}

		q.pop();
	}

	return parent[d];
}

void EdmondsKarp(int s,int d) {
	int flow=INT_MAX;

	unsigned int node;
	while (BFS(s,d)!=-1) {
		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);
		c[x][y]=z;
	}

	EdmondsKarp(1,n);

	out<<fMax;

	return 0;
}