Cod sursa(job #699350)

Utilizator nod_softwareBudisteanu Ionut Alexandru nod_software Data 29 februarie 2012 19:00:14
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.55 kb
#include <stdio.h>
#include <vector>
#include <queue>
#include <values.h>
using namespace std;

FILE * fin;
FILE * fout;

struct TEdge
{
	int Dest, Capacity, Value;
};

vector <TEdge> v[1001];
queue <int> que;

int visited[1001];
int preview[1001];

int n,m;

//--------------------------------------
void citire()
{
	fin = fopen("maxflow.in","r");
	fout = fopen("maxflow.out","w");
	
	fscanf(fin,"%d %d",&n,&m);
	int Node,i,j,ok;
	TEdge nod;
	for (int i=0; i<m; i++)
	{
		fscanf(fin,"%d %d %d",&Node,&nod.Dest,&nod.Capacity);
		nod.Value=0;
		
		ok=0;
		for (j=0; j<v[Node].size(); j++)
			if (v[Node][j].Dest==nod.Dest)
			{
				v[Node][j].Capacity+=nod.Capacity;
				ok=1;
				break;				
			}
		
		if (ok==0)
		{
			v[Node].push_back(nod);
			
			int aux=Node;
			Node=nod.Dest;
			nod.Dest=aux;
			
			v[Node].push_back(nod);
		}
	}

	
	fclose(fin);
}
//--------------------------------------
int BFS()
{
	int Node,i,Dest;
	que.push(1);
	
	for (i=2; i<=n; i++)
	{
		visited[i]=0;
		preview[i]=0;
	}
	
	while (que.size()>0)
	{
		Node=que.front();
		que.pop();
		
		for (int i=0; i<v[Node].size(); i++)
		{
			Dest=v[Node][i].Dest;
			if (visited[Dest]==0)
			if (v[Node][i].Capacity>v[Node][i].Value)
			{
				que.push(Dest);
				
				preview[Dest]=Node;
				visited[Dest]=1;
			}
		}
	}
	
	if (preview[n]!=0)
	{
		return 1;
	} else return 0;
}
//--------------------------------------
void solve()
{
	int Node;
	int a,i,minimum;
	while (BFS()==1)
	{
		minimum=INT_MAX;
		
		Node=n;
		
		
		while (preview[Node]!=0)
		{
			a=Node;
			Node=preview[Node];
			
			for (i=0; i<v[Node].size(); i++)
				if (v[Node][i].Dest==a)
				if (minimum>v[Node][i].Capacity-v[Node][i].Value)
				{
					minimum=v[Node][i].Capacity-v[Node][i].Value;
					
					break;
				}
		}
	
		
		Node=n;
		while (preview[Node]!=0)
		{    
			a=Node;
			Node=preview[Node];
			
			for (i=0; i<v[Node].size(); i++)
				if (v[Node][i].Dest==a)
				{
					v[Node][i].Value+=minimum;
					break;
				}
				
			for (i=0; i<v[a].size(); i++)
				if (v[a][i].Dest==Node)
				{
					v[a][i].Value-=minimum;
					break;
				}

		}
	}
}
//--------------------------------------
void afisare()
{
	int i,j,s=0;
	
	for (i=1; i<=n; i++)
		for (j=0; j<v[i].size(); j++)
			if (v[i][j].Dest==n)
				s=s+v[i][j].Value;

	fprintf(fout,"%d",s);
}
//--------------------------------------
int main()
{
	citire();
	
	visited[1]=1;
	solve();
	
	afisare();
	
	fclose(fout);
	return 0;
}