Cod sursa(job #1092550)

Utilizator anaid96Nasue Diana anaid96 Data 27 ianuarie 2014 10:43:53
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include<stdio.h>
#include<vector>
#include<queue>
#include<algorithm>
#include<string.h>

using namespace std;

FILE *in,*out;

//definitii
#define pb push_back

//functii
bool bfs();

//constante
const int Nmax=(int)1e3+1;
const int sursa=1;
const int oo=(1<<30)-1;

//variabile
int dest,muchii;
int nod1,nod2,cap;
vector<int>graph[Nmax];
int emptySpace[Nmax][Nmax];
int tata[Nmax];
int minflow,maxflow,node;

int main(void)
{
	in=fopen("maxflow.in","rt");
	fscanf(in,"%d%d",&dest,&muchii);
	while(muchii--)
	{
		fscanf(in,"%d%d%d",&nod1,&nod2,&cap);
		graph[nod1].pb(nod2);
		graph[nod2].pb(nod1);
		emptySpace[nod1][nod2]=cap;
	}	
	fclose(in);
	while(bfs())
	{
		vector<int> :: iterator it,end=graph[dest].end();
		for(it=graph[dest].begin() ; it!=end ; ++it)
		{
			if(!tata[*it] || !emptySpace[*it][dest])
				continue;
			tata[dest]=*it;
			minflow=oo;
			for(node=dest ; node!=sursa ; node=tata[node])
				minflow=min(minflow,emptySpace[tata[node]][node]);
			for(node=dest ; node!=sursa ; node=tata[node])
			{
				emptySpace[tata[node]][node]-=minflow;
				emptySpace[node][tata[node]]+=minflow;
			}	
			maxflow+=minflow;
		}	
		
	}	
	out=fopen("maxflow.out","wt");
	fprintf(out,"%d",maxflow);	
	fclose(out);
	return 0;
	
}	

bool bfs()
{
	memset(tata,0,sizeof(tata));
	tata[sursa]=-1;
	queue<int>q;
	q.push(sursa);
	while(!q.empty())
	{
		int curent=q.front();
		q.pop();
		
		if(curent==dest)
			break;
		vector<int> :: iterator it,end=graph[curent].end();
		for(it=graph[curent].begin() ; it!=end ; ++it)
		{
			if(!tata[*it] && emptySpace[curent][*it])
			{
				tata[*it]=curent;
				q.push(*it);
			}	
		}	
		
	}
	if(tata[dest])
		return true;
	else
		return false;
	
}