Pagini recente » Cod sursa (job #1284241) | Cod sursa (job #1998152) | Cod sursa (job #1092242) | Cod sursa (job #1683459) | Cod sursa (job #1043492)
#include <cstdio>
#include <vector>
using namespace std;
const int NMAX = 50010;
vector < pair< int, int > > G[NMAX];
vector < pair< int, int > >::iterator it;
int dist[NMAX], arb[NMAX*4], k, sol[NMAX];
bool viz[NMAX];
inline int min( int x, int y ){
if( x < y ) return x;
return y;
}
void actualizare( int nod, int l, int r ){
if( l == r ){
arb[nod] = k;
return;
}
else {
int mij = ( l + r ) / 2;
if( k <= mij ) actualizare( 2*nod, l, mij );
else actualizare( 2*nod + 1, mij + 1, r );
if( dist[arb[2*nod]] < dist[arb[2*nod+1]]) arb[nod] = arb[2*nod];
else arb[nod] = arb[2*nod+1];
}
}
int main()
{
freopen( "dijkstra.in", "r", stdin );
int n, m;
scanf( "%d %d", &n, &m );
for(; m >= 1; --m ){
int x, y, z;
scanf( "%d %d %d", &x, &y, &z );
G[x].push_back( make_pair( y, z ) );
}
fclose( stdin );
dist[1] = 0, k = 1;
actualizare( 1, 1, n );
for( int i = 2; i <= n; ++i ){
dist[i] = 1e9;
k = i;
actualizare( 1, 1, n );
}
for( int p = 1; p <= n; ++p ){
int x = arb[1];
for( it = G[x].begin(); it != G[x].end(); ++it ){
int y = it->first;
if( !viz[y] && dist[y] > dist[x] + it->second ){
dist[y] = dist[x] + it->second;
k = y;
actualizare( 1, 1, n );
}
}
sol[x] = dist[x];
dist[x] = 1e9, viz[x] = 1;
k = x;
actualizare( 1, 1, n );
}
freopen( "dijkstra.out", "w", stdout );
for( int i = 2; i <= n; ++i )
printf( "%d ", sol[i] );
fclose( stdout );
return 0;
}