Cod sursa(job #499227)

Utilizator siminescuPaval Cristi Onisim siminescu Data 9 noiembrie 2010 09:07:25
Problema Algoritmul lui Dijkstra Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include<stdio.h>
#include<vector>
using namespace std;
# define nmax 50001
# define inf 250000001
vector <int> d[nmax],v[nmax];
int n,m;
long long dist[nmax];
bool uz[nmax];
void citire()
{
	freopen("dijkstra.in","r",stdin);
	scanf("%d%d",&n,&m);int i,j,dis,p;
	for(p=1;p<=m;p++)
	{
		scanf("%d%d%d",&i,&j,&dis);
		v[i].push_back(j);
		d[i].push_back(dis);
	}
}
int minim()
{
	int i,q=inf,poz=0;
	for(i=1;i<=n;i++)
	{
		if(!uz[i] && dist[i]<q)
		{
			q=dist[i];poz=i;
		}
	}
	return poz;
}
int main()
{
	citire();int l,i,poz;
	for(i=1;i<=n;i++)
		dist[i]=inf;
	l=v[1].size();uz[1]=1;dist[1]=0;
	for(i=0;i<l;i++)
	{
		dist[v[1][i]]=d[1][i];
	}
	poz=minim();
	while(poz)
	{
		l=v[poz].size();
		for(i=0;i<l;i++)
			if(dist[v[poz][i]]>dist[poz]+d[poz][i])
			{
				dist[v[poz][i]]=dist[poz]+d[poz][i];
			}
		uz[poz]=1;
		poz=minim();
	}
	freopen("dijkstra.out","w",stdout);
	for(i=2;i<=n;i++)
		if(dist[i]!=inf) printf("%d ",dist[i]);
		else printf("%d ",0);
	return 0;
}