Cod sursa(job #895632)

Utilizator stay_awake77Cangea Catalina stay_awake77 Data 27 februarie 2013 12:01:19
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <cstdio>
#include <queue>
#include <cstring>
#include <vector>
#include <algorithm>

#define NMAX 50001
#define INF 0x3f3f3f3f
#define nod first
#define cost second
#define PII pair< int, int >

using namespace std;

int N, M, i, x, y, c;
int D[NMAX];
vector< PII > G[NMAX];

struct comp
{
    bool operator () (const int &X, const int &Y)
    {
        return ( D[X] > D[Y] );
    }
};

priority_queue< int, vector<int>, comp > Q;

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

    scanf("%d%d", &N, &M);
    for( ; M--; )
    {
        scanf("%d%d%d", &x, &y, &c);
        G[x].push_back( make_pair( y, c ) );
    }

    memset( D, INF, sizeof(D) );
    D[1] = 0;
    Q.push( 1 );

    while( !Q.empty() )
    {
        int Nod = Q.top();
        Q.pop();

        for( vector< PII >::iterator it = G[Nod].begin(); it != G[Nod].end(); ++it )
            if( D[Nod] + (*it).cost < D[(*it).nod] )
            {
                D[(*it).nod] = D[Nod] + (*it).cost;
                Q.push( (*it).nod );
            }
    }

    for( i = 2; i <= N; ++i  )
        if( D[i] == INF )
            printf("0 ");
        else
            printf("%d ", D[i]);
    printf("\n");

    return 0;
}