Cod sursa(job #553197)

Utilizator drywaterLazar Vlad drywater Data 13 martie 2011 19:18:11
Problema Algoritmul lui Dijkstra Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <stdio.h>
FILE *f=fopen("dijkstra.in","r"),*g=fopen("dijkstra.out","w");
int n,m,h[50001],poz[50001],d[50001],i,x,y,c,k;
struct nod{int y; int d; nod* next;};
nod *a[50001];
const int inf=1<<30;
int add(int x, int y,int c)
{
	nod *q=new nod;
	q->y=y;
	q->d=c;
	q->next=a[x];
	a[x]=q;
	return 0;
}
int swap(int a,int b)
{
	int k=h[a];
	h[a]=h[b];
	h[b]=k;
	return 0;
}
int sift(int x)
{
	int s1,s2,max;
	while (x<=k)
	{
		s1=x<<1;
		s2=s1+1;
		if (s1<=k)
		{
			max=s1;
		}
		else return 0;
		if (s2<=k && d[h[s2]]>d[h[s1]])
			max=s2;
		if (d[h[max]]>d[h[x]])
		{
			poz[h[x]]=max;
			poz[h[max]]=x;
			swap(x,max);
		}
		x=max;
	}
	return 0;
}
int perc(int x)
{
	int dad=x>>1;
	while (x>1)
	{
		if (d[dad]<d[x])
		{
			poz[h[x]]=dad;
			poz[h[dad]]=x;
			swap(dad,x);
			x=dad;
		}
		else x=1;
	}
	return 0;
}
int main(void)
{
	int min=inf;
	fscanf(f,"%d%d",&n,&m);
	for (i=1;i<=m;i++)
	{
		fscanf(f,"%d%d%d",&x,&y,&c);
		add(x,y,c);
	}
	for (i=1;i<=n;i++)
		d[i]=inf, poz[i]=-1;
	h[1]=1;
	poz[1]=1;
	d[1]=0;
	k=1;
	while (k)
	{
		min=h[1];
		swap(1,k);
		k--;
		sift(1);
		nod *q=a[min];
		while (q!=NULL)
		{
			if (d[min]+q->d<d[q->y])
			{
				d[q->y]=d[min]+q->d;
				if (poz[q->y]!=-1)
					perc(poz[q->y]);
				else
				{
					h[++k]=q->y;
					poz[q->y]=k;
					perc(k);
				}
			}
			q=q->next;
		}
	}
	for (i=2;i<=n;i++)
	{
		fprintf(g,"%d ",d[i]==inf ? 0:d[i]);
	}
	fprintf(g,"\n");
	fclose(g);
	return 0;
}