Cod sursa(job #186013)

Utilizator amadaeusLucian Boca amadaeus Data 26 aprilie 2008 15:54:22
Problema Algoritmul lui Dijkstra Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 2.02 kb
#include <stdio.h>
#include <stdlib.h>

struct edge {
	int v, w;
};
typedef struct edge edge;

#define INF 0x3f3f3f3f
#define NX 50010

edge *G[ NX ];
int N, M, sz;
int h[NX], p[NX], dist[NX], deg[NX];

#define BSZ (1<<16)
char buf[BSZ]; int bp;

int get() {
	int x = 0;

	while( buf[bp] < '0' || buf[bp] > '9' )
		if( ++bp == BSZ )
			fread( buf, 1, BSZ, stdin ), bp = 0;

	while( buf[bp] >= '0' && buf[bp] <= '9' ) {
		x = x*10 + buf[bp] - '0';
		if( ++bp == BSZ )
			fread( buf, 1, BSZ, stdin ), bp = 0;
	}
	return x;
}

void cit() {
	int i, u, v, w;
	
	buf[ bp = BSZ-1 ] = 0;
	N = get(), M = get();
	while( M-- )
		u = get(), v = get(), w = get(), deg[u]++;

	for( i = 1; i <= N; i++ )
		G[i] = (edge *)malloc( (deg[i] + 1) * sizeof(edge) ),
		deg[i] = 0;

	rewind( stdin );

	buf[ bp = BSZ-1 ] = 0;
	N = get(), M = get();
	while( M-- )
		u = get(), G[u][deg[u]].v = get(), G[u][deg[u]++].w = get();
}

void hswap( int u, int v ) {
	int t = h[u]; h[u] = h[v]; h[v] = t;
	p[h[u]] = u, p[h[v]] = v;
}

void swim( int node ) {
	int u = p[node];
	for( ; u>1 && dist[h[u]] < dist[h[u>>1]]; u >>= 1 )
		hswap( u, u>>1 );
}

int pop() {
	int x = h[1], u = 1, l, v;
	h[1] = h[ sz-- ];
	while( 1 ) {
		l = u<<1, v = u;
		if( l<=sz && dist[ h[l] ] < dist[ h[v] ] ) v = l;
		if( l<sz && dist[ h[l+1] ] < dist[ h[v] ] ) v = l+1;
		if( v==u ) break;
		hswap( u, v ), u = v;
	}
	return x;
}

void rez() {
	int u, v, w, i;
	
	for( i = 1; i <= N; i++ )
		dist[i] = INF,
		h[i] = p[i] = i;

	dist[1] = 0, sz = N;

	while( sz ) {
		u = pop();
		if( dist[u] == INF ) break;
		for( i = 0; i < deg[u]; i++ ) {
			v = G[u][i].v, w = G[u][i].w;
			if( dist[v] > dist[u] + w )
				dist[v] = dist[u] + w, swim(v);
		}
	}
}

void scr() {
	int i;

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

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

	cit();
	rez();
	scr();

	return 0;
}