Cod sursa(job #268701)

Utilizator pascu_iulianPascu Iulian pascu_iulian Data 1 martie 2009 18:06:29
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
// Dijkstra

#include <stdio.h>
#define maxn 50001
#define inf 0x3f3f3f3f;

struct graf{
	int nod, cost;
	graf *nxt;
} *a[maxn],*q;

int n,m;
int d[maxn]={inf}, dim=0;
int p[maxn]={-1}, h[maxn];

void swap(int x, int y)
{
	int aux=h[x];
	h[x]=h[y];
	h[y]=aux;
	p[h[x]]=x;
	p[h[y]]=y;
}

void up (int k)
{
	if (k>1) {
	if (d[h[k]]< d[h[k/2]])
	{	swap(k,k/2);
		up(k/2);
	}		 }
}

void down (int k)
{
	int min=k;
	if ( k*2<= dim && d[h[k*2]]<d[h[min]])
		min=k*2;
	if ( k*2+1<= dim && d[h[k*2+1]]<d[h[min]])
		min=k*2+1;
	if (min!=k)
	{	swap(min,k);
		down(min);
	}
}


void dijkstra ( int k)
{
	h[++dim]=1; //initializez heapul
	p[1]=1;

	while (dim) //cat timp heapul nu e gol
	{
		swap(1,dim); //extrag minimul
		down(1);
		dim--;
		int min=h[1];
		graf *q= a[min];

		while (q)
		{
			if ( d[q->nod]> d[min]+ q->cost )
			{
			   d[q->nod]= d[min]+ q->cost;

			   if(p[q->nod]!= -1)
				  up(p[1]);
			   else
			   {
				   h[++dim]= q->nod;
				   p[h[dim]]=dim;
				   up(dim);
			   }
			}  //end.if
			q=q->nxt;
		}	//end.while
	}	//end.while
}

int main()
{
	freopen("dijkstra.in","r",stdin);
	freopen("dijkstra.out","w",stdout);
	scanf("%d %d", &n, &m);
	int i,x,y,c;
	for(i= 1; i<= m; ++i)
	{
		scanf("%d %d %d", &x, &y, &c);
		p= new graf;
		p-> nxt= a[x];
		p-> nod= y;
		p-> cost= c;
		a[x]= p;
	}

	d[1]=0;
	dijkstra ();

	for(i=2; i<=n; ++i)
		printf("%d ",d[i]);

	fclose(stdout);
	return 0;
}