Cod sursa(job #1474063)

Utilizator glbglGeorgiana bgl glbgl Data 20 august 2015 20:34:33
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <stdio.h>
#include <stdlib.h>
#include <fstream>
#include <vector>
#include <queue>

#define INF 1<<30

using namespace std;

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

typedef struct arc{
	int cap, flow, s, t;
	arc *rev;
} Edge, *AEdge;

int N, M, source, dest, maxflow = 0;
vector< vector<AEdge> > graph;


void read(){

	in >> N >> M;
	source = 1;
	dest = N;

	for(int i = 0; i <= N; ++i){
		vector<AEdge> v;
		graph.push_back(v);
	}

	int x, y, c;
	
	for(int i = 0; i < M; ++i){
		in >> x >> y >> c;
		//creem un edge
		AEdge e = (AEdge)malloc(sizeof(Edge));
		AEdge e1 = e;
		e->s = x;
		e->t = y;
		e->cap = c;
		e->flow = 0;

		AEdge r = (AEdge)malloc(sizeof(Edge));
		AEdge r1 = r;
		r->s = y;
		r->t = x;
		r->cap = 0;
		r->flow = 0;
		r->rev = e;
		e->rev = r;

		graph[x].push_back(e);
	}
}


void EdmondsKarp(){

	while(1){

		queue<int> Q;
		Q.push(source);
		vector<AEdge> pred(N+1);
		while(!Q.empty()){
			int u = Q.front();
			Q.pop();
			for(unsigned int i = 0; i < graph[u].size(); ++i){
				
				AEdge e = graph[u][i];

				if(pred[(*e).t] == NULL && (*e).t != source && (*e).cap > (*e).flow){
					pred[(*e).t] = e;
					Q.push((*e).t);
				}
			}
		}

		if(pred[dest] == NULL){
			break;
		}

		int df = INF;

		for(AEdge e = pred[dest]; e != NULL; e = pred[(*e).s]){
			df = min(df, (*e).cap - (*e).flow);
		}

		for(AEdge e = pred[dest]; e != NULL; e = pred[(*e).s]){
			(*e).flow = (*e).flow + df;
			((*e).rev)->flow = ((*e).rev)->flow - df;
		}

		maxflow = maxflow + df;
	}
}


int main(){

	read();
	EdmondsKarp();
	out << maxflow;
}