Cod sursa(job #177279)

Utilizator amadaeusLucian Boca amadaeus Data 12 aprilie 2008 17:03:57
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.24 kb
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <algorithm>

using namespace std;

#define NX 50010
#define INF 0x3f3f3f3f

struct edge {
	int u, v, w;
	edge( int a, int b, int c ) : u(a), v(b), w(c) {}
};

vector< edge > G[ NX ];
int V, E, dist[ NX ], col[ NX ];

struct Heap {
private:
	int h[ NX ], p[ NX ], sz;

	bool hless( int u, int v ) {
		return dist[ h[u] ] < dist[ h[v] ];
     }

	void hswap( int u, int v ) {
		swap( h[u], h[v] );
		swap( p[ h[u] ], p[ h[v] ] );
     }
	
	void hswim( int u ) {
		for( ; u > 1 && hless( u, u>>1 ); u >>= 1 )
			hswap( u, u>>1 );
     }

	void hsink( int u ) {
		int v, l, r;
		while( 1 ) {
			v = u; l = u<<1; r = l+1;
			if( l <= sz && hless( l, u ) ) v = l;
			if( r <= sz && hless( r, v ) ) v = r;
			if( v == u ) break;
			hswap( u, v ); u = v;
     	}
     }

public:
	void add( int x ) {
		h[ ++sz ] = x; p[ x ] = sz;
     }

	int pop() {
		int tmp = h[ 1 ];
		hswap( 1, sz-- );
		hsink( 1 );
     	return tmp;
     }

	void upd( int x ) {
		hswim( p[ x ] );
     }
};

Heap H;

#define BUFFSZ (1<<15)
char buff[ BUFFSZ ], *pp = buff;

int get() {
	int x = 0;

	while( *pp < '0' || *pp > '9' )
		if( !*(++pp) )
			fread( buff, 1, BUFFSZ-1, stdin ), pp = buff;

	while( *pp >= '0' && *pp <= '9' ) {
		x = x * 10 + *pp - '0';
		if( !*(++pp) )
			fread( buff, 1, BUFFSZ-1, stdin ), pp = buff;
	}
	return x;
}

void cit() {
	int u, v, w;
	
	V = get();
	E = get();

	for( ; E; E-- ) {
		u = get();
		v = get();
		w = get();
		G[u].push_back( edge( u, v, w ) );
     }
}

void relax( const edge e ) {
	int tmp = dist[ e.u ] + e.w;
	if( dist[ e.v ] > tmp ) {
		dist[ e.v ] = tmp; H.upd( e.v );
     }
}

void rez() {
	int i, u;
	
	for( i = 1; i <= V; i++ ) {
		dist[ i ] = INF; H.add( i );
     }
	dist[ 1 ] = 0; H.upd( 1 );

	for( i = 1; i <= V; i++ ) {
		u = H.pop();
		if( dist[ u ] >= INF ) break;
		for_each( G[u].begin(), G[u].end(), relax );
	}
}

void scr() {
	int i;
	for( i = 2; i <= V; i++ )
		printf( "%d ", dist[ i ] == INF ? 0 : dist[ i ] );
}

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

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

	return 0;
}