Cod sursa(job #146098)

Utilizator MarquiseMarquise Marquise Data 1 martie 2008 10:36:44
Problema Algoritmul lui Dijkstra Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <stdio.h>

#define NMAX 50001
#define INF 1 << 26

struct nod
{
	int v, cost;
	nod *next;
};

nod *m[NMAX];

int N, M, viz[NMAX], s[NMAX];


void adaug(int x, int y, int c)
{
	nod *aux;
	if ( m[x] == NULL)
	{
		m[x] = new nod;
		m[x] -> v = y;
		m[x] -> cost = c;
		m[x] -> next = NULL;
	}
	else
	{
		aux = new nod;
		aux -> v = y;
		aux -> cost = c;
		aux -> next = m[x];
		m[x] = aux;
	}
}

int main()
{
	int i, x, y, c, poz, j, min;
	nod *p;

	freopen("dijkstra.in", "r", stdin);
	freopen("dijkstra.out", "w", stdout);

	scanf("%d %d", &N, &M);
	for ( i = 1; i <= M; i++)
	{
		scanf("%d %d %d", &x, &y, &c);
		adaug(x, y, c);
	}

	for ( i = 1; i <= N; i++)
		s[i] = INF;

	for ( p = m[1]; p; p = p -> next)
		s[ p -> v ] = p -> cost;

	s[1] = 0;
	viz[1] = 1;

	for ( i = 1; i < N; i++)
	{
		min = INF;
		for ( j = 1; j <= N; j++)
			if ( !viz[j] && s[j] < min)
			{
				min = s[j];
				poz = j;
			}

		viz[poz] = 1;
		for ( p = m[poz]; p ; p = p -> next)
			if ( !viz[ p -> v] && p -> cost + min < s[ p -> v] )
				s[ p -> v ] = p-> cost + min;
	}


	for ( i = 2; i <= N; i++)
		if ( s[i] == INF)
			printf("0 ");
		else
			printf("%d ", s[i]);

	return 0;
}