Cod sursa(job #1043492)

Utilizator ioalexno1Alexandru Bunget ioalexno1 Data 28 noiembrie 2013 17:50:00
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.9 kb
#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;
}