Cod sursa(job #400872)

Utilizator razvan_3dragomir razvan razvan_3 Data 22 februarie 2010 09:01:29
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include<fstream.h>
ifstream intrare("dijkstra.in");
ofstream iesire("dijkstra.out");
#define maxm 50000
#define maxn 500000
int n,m;
int lista[maxm][3];
int start[maxn];
int inf=32000;
int d[maxn];
int vizitat[maxn];
void citeste()
{
	//iesire<<n;
	//intrare>>n>>m;
	int a,b,c;
	for(int i=1;i<=2*m;i++)
	{
		intrare>>a>>b>>c;
		lista[i][0]=b;
		lista[i][1]=c;
		lista[i][2]=start[a];
		start[a]=i++;
		lista[i][0]=a;
		lista[i][1]=c;
		lista[i][2]=start[b];
		start[b]=i;
		if(a==1)d[b]=c;
		if(b==1)d[a]=c;
	}
}
void parcurge()
{
	int ramase=n-1;
	int index=1;
	int dist_min=0,st;
	while(ramase!=0&&index>0)
	{
		ramase--;
		vizitat[index]=1;
		st=start[index];
	    while(st!=0)
		{
			int vec=lista[st][0];
			if(d[vec]>dist_min+lista[st][1])
				d[vec]=dist_min+lista[st][1];
			st=lista[st][2];
		}
		index=0;
		dist_min=inf;
		for(int i=2;i<=n;i++)
		{
			if(vizitat[i]==0&&dist_min>d[i])
			{
				index=i;dist_min=d[i];
			}
		}
	}
}
void afisare()
{
	for(int i=2;i<=n;i++)
	{
		if(d[i]!=inf)iesire<<d[i]<<" ";
		else iesire<<"0 ";
	}
}
int main()
{
	intrare>>n>>m;
	for(int i=1;i<=n;i++)
		d[i]=inf;
	d[1]=0;
	vizitat[1]=1;
	citeste();
	parcurge();
	afisare();
	return 0;
}