Pagini recente » Cod sursa (job #663528) | Cod sursa (job #952847) | Cod sursa (job #1074849) | Cod sursa (job #831761) | Cod sursa (job #155647)
Cod sursa(job #155647)
#include <stdio.h>
#include <stdlib.h>
#define NX 50010
#define INF 0x3f3f3f3f
struct edge {
int v, w;
};
typedef struct edge edge;
edge *G[ NX ];
int V, E, dist[ NX ], col[ NX ], deg[ NX ];
int h[ NX ], p[ NX ], sz;
int hless( int u, int v ) {
return dist[ h[u] ] < dist[ h[v] ];
}
void hswap( int u, int v ) {
int tmp = h[u]; h[u] = h[v]; h[v] = tmp;
p[ h[u] ] = u; p[ h[v] ] = 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;
}
}
void add( int x ) {
h[ ++sz ] = x; p[ x ] = sz;
}
void build() {
int i;
for( i = 1, sz = V; i <= sz; i++ )
h[i] = p[i] = i;
}
int pop() {
int tmp = h[ 1 ];
hswap( 1, sz-- );
hsink( 1 );
return tmp;
}
void upd( int x ) {
hswim( p[ x ] );
}
void cit() {
int i, u, v, w;
for( scanf( "%d%d", &V, &E ); E; E-- ) {
scanf( "%d%d%d", &u, &v, &w );
deg[ u ]++;
}
for( i = 1; i <= V; i++ ) {
G[i] = (edge *) malloc( (deg[i] + 1) * sizeof( edge ) );
deg[ i ] = 0;
}
rewind( stdin );
for( scanf( "%d%d", &V, &E ); E; E-- ) {
scanf( "%d%d%d", &u, &v, &w );
G[u][ deg[u] ].v = v;
G[u][ deg[u] ].w = w;
deg[ u ]++;
}
for( i = 1; i <= V; i++ )
G[i][ deg[i] ].v = -1;
}
void rez() {
int i, u;
edge *x;
for( i = 1; i <= V; i++ ) {
dist[ i ] = INF;
}
build(); dist[ 1 ] = 0;
for( i = 1; i <= V; i++ ) {
u = pop();
if( dist[ u ] >= INF ) break;
for( x = G[u]; x->v != -1; x++ )
if( dist[ u ] + x->w < dist[ x->v ] ) {
dist[ x->v ] = dist[ u ] + x->w;
upd( x->v );
}
}
}
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;
}