Cod sursa(job #448473)

Utilizator TabaraTabara Mihai Tabara Data 3 mai 2010 20:33:52
Problema Algoritmul lui Dijkstra Scor 40
Compilator c Status done
Runda Arhiva educationala Marime 1.5 kb
#include <stdio.h>
#include <stdlib.h>

#define in "dijkstra.in"
#define out "dijkstra.out"
#define NMAX 50005
#define MMAX 250005
#define INF (1<<30)
#define DIM 3000000

typedef struct nod {
	int vf;
	int c;
	struct nod* next;
} *PNOD, NOD;

PNOD L[NMAX];
int N, M;
int d[NMAX];
char sel[NMAX];
int minim, ok;

void Add( int i, int j, int c)
{
	PNOD p = (PNOD) calloc(1, sizeof(NOD));
	p->vf = j;
	p->c= c;
	p->next = L[i];
	L[i] = p;
}

int main(void)
{
	freopen (in, "r", stdin);
	freopen (out, "w", stdout);

	int i, j, k, tur, poz = 0;
	PNOD p;
	char buf[DIM];

	fread (buf, 1, DIM, stdin);
	#define cit(x)										  \
	{													  \
		x = 0;											  \
		while (buf[poz] < '0')							  \
		{												  \
			++poz;										  \
			if (poz == DIM) {							  \
				fread (buf, 1, DIM, stdin); poz = 0; }	  \
		}												  \
		while (buf[poz] >= '0')							  \
		{												  \
			x = x*10 + buf[poz] - '0';					  \
			if (++poz == DIM) {							  \
					fread (buf, 1, DIM, stdin); poz = 0;} \
		}												  \
	}

	cit (N) cit (M)
	for ( ; M; --M)
	{
		cit (i) cit(j) cit(k)
		Add (i, j, k);
	}

	for (i = 1; i <= N; ++i)
	{
		d[i] = INF;
		sel[i] = 0;
	}
	d[1] = 0;

	for (tur = 1; tur <= N; ++tur)
	{
		minim = INF;
		for (i = 1; i <= N; ++i)
			if ( !sel[i] && minim > d[i])
			{
				minim = d[i];
				ok = i;
			}
		sel[ok] = 1;
		for (p = L[ok]; p; p = p->next)
			if ( d[p->vf] > d[ok] + p->c)
				d[p->vf] = d[ok] + p->c;
	}

	for (i = 2; i <= N; ++i)
		printf ("%d ", d[i] == INF ? 0 : d[i]);

	return 0;
}