Nu aveti permisiuni pentru a descarca fisierul grader_test8.in

Cod sursa(job #1119466)

Utilizator anaid96Nasue Diana anaid96 Data 24 februarie 2014 17:58:40
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include<stdio.h>
#include<vector>
#include<algorithm>
#include<queue>
#include<string.h>

using namespace std;

FILE *in,*out;

//definitii
#define pb push_back

//funstii
bool bfs();

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

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


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

bool bfs()
{
	memset(tata,0,sizeof(tata));
	queue<int> q;
	q.push(sursa);
	tata[sursa]=-1;
	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])
			{
				q.push(*it);
				tata[*it]=curent;
			}	
		}
	}	
	if(tata[dest])
		return true;
	return false;
	
}