Cod sursa(job #573987)

Utilizator GaborGabrielFMI - GabrielG GaborGabriel Data 6 aprilie 2011 18:53:44
Problema Algoritmul lui Dijkstra Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <fstream.h>
int n,m,min;
int viz[50005],cost[50005];

struct nod{
	int nr,co;
	nod *urm;
} *A[50005],*p;

void adauga(int a, int b, int c)
{
	p=new nod;
	p->nr=b;
	p->co=c;
	p->urm=A[a];
	A[a]=p;
}

void afis()
{
	for(int i=2;i<=n;i++)
		printf("%d ",cost[i]);	
}


void dijkstra(int s)
{
	int i,j;	
	viz[s]=1;
	p=A[s];
	while(p)
		cost[p->nr]=p->co,p=p->urm;
	for(i=2;i<n;i++)
	{
		min=1;
		while(viz[min] || !cost[min]) min++;
		if(min>n)
			break;
		for(j=min+1;j<=n;j++)
			if(!viz[j] && cost[j] && cost[j] < cost[min]) min=j;
		viz[min]=1;
		p=A[min];
		while(p)
		{
			if((!cost[p->nr] || cost[p->nr] > cost[min] + p->co)&&!viz[p->nr])
				cost[p->nr] = cost[min]+p->co;
			p=p->urm;
		}
	}
}

int main()
{
	
	freopen("dijkstra.in","r",stdin);
	freopen("dijkstra.out","w",stdout);
	int a,b,c,i;
	scanf("%d %d",&n,&m);
	for(i=1;i<=m;i++)
	{
		scanf("%d %d %d",&a,&b,&c);
		adauga(a,b,c);		
	}
	dijkstra(1);
	afis();
	return 0;
}