Cod sursa(job #475532)

Utilizator mihai995mihai995 mihai995 Data 7 august 2010 12:05:30
Problema Algoritmul lui Dijkstra Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <fstream>
using namespace std;

int d[1<<16],v[1<<16],s[1<<16],place[1<<16],n,m;
const int inf=1<<30;
struct arc{int x,y,d;} a[1<<19];
bool use[1<<16];

ifstream in("dijkstra.in");
ofstream out("dijkstra.out");

bool cmp(arc a,arc b)
{
	return a.x<b.x;
}

inline void sch(int &a,int &b)
{
	int d=a;
	a=b;
	b=d;
	d=place[a];
	place[a]=place[b];
	place[b]=d;
}

inline void up(int x)
{
	if (x>1 && d[v[x]]<d[v[x>>1]])
	{
		sch(v[x],v[x>>1]);
		up(x>>1);
	}
}

inline void down(int x)
{
	int q=x;
	if (2*x<=v[0] && d[v[2*x]]<d[v[x]])
		q=2*x;
	if (2*x<v[0] && d[v[2*x+1]]<d[v[x]])
		q=2*x+1;
	if (q!=x)
	{
		sch(v[x],v[q]);
		down(q);
	}
}

int main()
{
	int i,j,X;
	in>>n>>m;
	for (i=1;i<=m;i++)
		in>>a[i].x>>a[i].y>>a[i].d;
	sort(a+1,a+m+1,cmp);
	for (i=j=1;i<=n;i++)
	{
		for (;j<=m && a[j].x<i;j++);
		s[i]=j;
		d[i]=inf;
	}
	s[n+1]=m+1;
	v[++v[0]]=1;
	X=1000;
	d[1]=0;
	while (X)
	{
		X=v[1];
		use[X]=true;
		v[1]=v[v[0]--];
		down(1);
		for (i=s[X];i<s[X+1];i++)
		{
			if (!use[a[i].y])
			{
				use[a[i].y]=true;
				v[++v[0]]=a[i].y;
				place[a[i].y]=v[0];
			}
			if (d[a[i].y]>d[X]+a[i].d)
			{
				d[a[i].y]=d[X]+a[i].d;
				up(place[a[i].y]);
			}
		}
	}
	for (i=2;i<=n;i++)
		if (d[i]==inf)
			out<<"0 ";
		else
			out<<d[i]<<" ";
	out<<"\n";
	return 0;
}