Cod sursa(job #838082)

Utilizator mariacMaria Constantin mariac Data 18 decembrie 2012 22:49:59
Problema Algoritmul lui Dijkstra Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 2.17 kb
#include<fstream>
#include<vector>
#define infin 250000002
using namespace std;



ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");
int v[50002];
struct muchie
{
	int inf;
	int cost;
};
	
vector <muchie> lv[50002];
int pret[50002],aux;
int n,mm;


int poz[50002],heap[50002],ordin[50002],k=0,j=0;
void add(int cost,int nod)
{	
	poz[nod]=++j;
	ordin[j]=nod;
	heap[j]=cost;
	int j2;
	j2=j;
	while(j>1&&heap[j/2]>heap[j])
		{
			int aux;
			aux=heap[j/2];
			heap[j/2]=heap[j];
			heap[j]=aux;
			poz[ordin[j/2]]=j;
			poz[ordin[j]]=j/2;
			aux=ordin[j/2];
			ordin[j/2]=ordin[j];
			ordin[j]=aux;
			j=j/2;
		}
	j=j2;
}
void update(int x,int cost)
{
	int j2;
	j2=poz[x];
	heap[j2]=cost;
	while(j2>1&&heap[j2/2]>heap[j2])
		{
			int aux;
			aux=heap[j2/2];
			heap[j2/2]=heap[j2];
			heap[j2]=aux;
			poz[ordin[j2/2]]=j2;
			poz[ordin[j2]]=j2/2;
			aux=ordin[j2/2];
			ordin[j2/2]=ordin[j2];
			ordin[j2]=aux;
			j2=j2/2;
		}
}

void remove(int x)
{ 
	int u,p,aux;
	u=poz[x];
	heap[u]=heap[j];
	heap[j]=0;
	ordin[u]=ordin[j];
	poz[ordin[j]]=u;
	j--;
	while(heap[2*u]&&(heap[2*u]<heap[u]||(heap[2*u+1]&&heap[2*u+1]<heap[u])))
		{
			if(heap[2*u+1]&&heap[2*u+1]<heap[2*u])p=2*u+1;
				else p=2*u;
			aux=heap[p];
			heap[p]=heap[u];
			heap[u]=aux;
			poz[ordin[p]]=u;
			poz[ordin[u]]=p;
			aux=ordin[p];
			ordin[p]=ordin[u];
			ordin[u]=aux;
			u=p;
		}
}


int main()
{
	int i;
	
	fin>>n;
	fin>>mm;
	for(i=1;i<=mm;i++)
	{	
		int x;
		muchie y;
		fin>>x>>y.inf>>y.cost;
		lv[x].push_back(y);
	}
	add(0,1);
	pret[1]=0;
	for(i=2;i<=n;i++)
		{add(infin,i);
	     pret[i]=infin;
		}
	
	int j;
	int n1;
	n1=n;
	while(n1)
	{
		 int cine,cat;
		 cine=ordin[1];
		 
		 v[cine]=1;
		 cat=lv[cine].size();
		 for(i=0;i<cat;i++)
		 {
		 
			 if(!v[lv[cine][i].inf]&&pret[cine]+lv[cine][i].cost<pret[lv[cine][i].inf])
 			 {
				 pret[lv[cine][i].inf]=pret[cine]+lv[cine][i].cost;
				 update(lv[cine][i].inf,pret[lv[cine][i].inf]);
			 }
		 }
		 remove(cine);
	 n1--;}
	 
	 for(i=2;i<=n;i++)
		{if(pret[i]!=infin)fout<<pret[i]<<" ";
	       else fout<<"0 ";
		}
		
		 
	
	return 0;
}