Cod sursa(job #864074)

Utilizator TeOOOVoina Teodora TeOOO Data 24 ianuarie 2013 17:35:05
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.03 kb
//Include
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <string.h>
#include <queue>
using namespace std;

//Definitii
#define pb push_back

//Cosntante
const int sz = 1001;
const int source = 1;
const int oo = (1<<30) - 1;

//Functii
bool bfs();

//Variabile
FILE *in,*out;

bool visited[sz];

int destination, edges,maxFlow;
int father[sz];
int capacity[sz][sz], flow[sz][sz];

vector <int> graph[sz];


//Main
int main(void)
{
    in=fopen("maxflow.in","rt");
    out=fopen("maxflow.out","wt");
	fscanf(in,"%d%d",&destination,&edges);
	int rFrom, rTo, rCapacity;

	for(int i=1;i<=edges;++i)
	{
		fscanf(in,"%d%d%d",&rFrom,&rTo,&rCapacity);
		graph[rFrom].pb(rTo);
		graph[rTo].pb(rFrom);

		capacity[rFrom][rTo]=rCapacity;
	}

	while(bfs())
	{

		vector <int>::iterator it, end=graph[destination].end();
		for(it=graph[destination].begin() ; it!=end; ++it)
		{
			if((!visited[*it]) || flow[*it][destination] == capacity[*it][destination])
				continue;

			father[destination] = *it;
			int minFlow = oo;

			for(int node=destination ; node!=source ; node=father[node])
				minFlow = min(minFlow, (capacity[father[node]][node] - flow[father[node]][node]));

			for(int node=destination ; node!=source ; node=father[node])
			{
				flow[father[node]][node] += minFlow;
				flow[node][father[node]] -= minFlow;
			}
			maxFlow += minFlow;
		}
	}
	fprintf(out,"%d\n",maxFlow);


    fclose(in);
    fclose(out);
    return 0;
}

bool bfs()
{
	memset(visited,false,sizeof(visited));
	visited[source] = true;

	queue<int > q;
	q.push(source);

	vector <int>::iterator it, end;
	while(!q.empty())
	{
		int current = q.front();
		q.pop();

		if(current == destination)
			break;
		end = graph[current].end();
		for(it=graph[current].begin() ; it!=end ; ++it)
		{
			if(!visited[*it] && (flow[current][*it] != capacity[current][*it]))
			{
				visited[*it] = true;
				q.push(*it);
				father[*it] = current;
			}
		}
	}
	return visited[destination];
}
//Ce stil are ->