Cod sursa(job #359225)

Utilizator serbanlupulupulescu serban serbanlupu Data 26 octombrie 2009 12:02:08
Problema Algoritmul lui Dijkstra Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.94 kb
//Infoarena

#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>

using namespace std;

#define oo (1<<30-1)*2+1

int nodes;
vector< vector< pair < int, int> > > List;

void read(const char * buff_file)
{
	fstream f(buff_file, ios::in);
	if (f==NULL)
	{
		cerr<<"ERROR!";
		exit(0);
	}
	else
	{
		f>>nodes;
		int edges;
		List.reserve(nodes+1);
		List.resize(nodes+1);
		f>>edges;
		
		int left, right, value;
		
		for (int i=1; i<=edges; ++i)
		{
			f>>left>>right>>value;
			List[left].push_back(make_pair(right, value));
		}
		f.close();
	}
}

int * used;
int * dest;

void set_nr(int temp[], int nr_temp=nodes, int value=0)
{
	for (int i=1; i<=nr_temp; ++i)
		temp[i]=value;
}

struct cmp
{
	bool operator() (const int & left, const int & right) const
	{
		if (dest[left] < dest[right])
			return 0;
		else
			return 1;
	}
};

void Dijkstra()
{
	used=new int[nodes+1];
	dest=new int[nodes+1];
	
	set_nr(used, nodes, 0);
	set_nr(dest, nodes, oo);
	
	used[1]=1;
	dest[1]=0;
	
	priority_queue<int, vector<int>, cmp> Q;
	
	for (vector<pair<int, int> >::iterator it=List[1].begin(); it < List[1].end(); it++)
	{
		dest[it->first] = it->second;
		Q.push(it->first);
	}

	for (int i=1; (i<=nodes-1)&&(!Q.empty()); ++i)
	{
		int x=Q.top();
		Q.pop();
		if (used[x]==0)
		{
			used[x]=1;
			for (vector<pair<int, int> >::iterator it=List[x].begin(); it < List[x].end(); it++)
			{
				if (dest[it->first] > dest[x] + it->second ) 
				{
					dest[it->first]=dest[x]+it->second;
					if (used[it->first]==0)
						Q.push(it->first);
				}
			}
		}
		else
			--i;
	};
};

void print(const char * out_file)
{
	fstream g(out_file, ios::out);
	for (int i=2; i<=nodes; ++i)
		if (dest[i] != oo)
			g<<dest[i]<<" ";
		else
			g<<"0 ";
	g.close();
}

int main()
{
	read("dijkstra.in");
	Dijkstra();
	print("dijkstra.out");
	return 0;
}