Cod sursa(job #160899)

Utilizator raduzerRadu Zernoveanu raduzer Data 17 martie 2008 11:32:39
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <stdio.h>
#include <vector>
#define inf 0x3f3f3f3f
using namespace std;

int n,m,x,y,c,b[50010],h[65600],size[50010],z,p,q;
vector <int> a[50010];
vector <int> cost[50010];

int main()
{
	freopen("dijkstra.in","r",stdin);
	freopen("dijkstra.out","w",stdout);
	scanf("%d%d",&n,&m);
	int i,j;
	for (i=1; i<=n; ++i)
	{
		scanf("%d%d%d",&x,&y,&c);
		a[x].push_back(y);
		cost[x].push_back(c);
		size[x]=a[x].size();
	}
	b[1]=0;
	for (i=2; i<=n; ++i) { b[i]=inf;h[i]=i; }
	h[1]=1;
	z=n;
	for (i=1; i<=n; ++i)
	{
		for (j=0; j<size[h[1]]; ++j)
			if (b[h[1]]+cost[h[1]][j]<b[a[h[1]][j]]) b[a[h[1]][j]]=b[h[1]]+cost[h[1]][j];
		h[1]=h[z--];
		p=1;
		q=1;
		while (q==0)
		{
			q=0;
			if (b[h[p]]>b[h[p*2]])
			{
				q=1;
				x=h[p];
				h[p]=h[p*2];
				h[p*2]=x;
				p=p*2;
			}
			else
			if (b[h[p]]>b[h[p*2+1]])
			{
				q=1;
				x=h[p];
				h[p]=h[p*2+1];
				h[p*2+1]=x;
				p=p*2+1;
			}
		}
	}
	for (i=2; i<=n; ++i)
	{
		if (b[i]==inf) { printf("0 "); continue; }
		printf("%d ",b[i]);
	}
	return 0;
}