Cod sursa(job #1446860)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 2 iunie 2015 23:52:04
Problema Algoritmul lui Dijkstra Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <cstdio>
#include <queue>
#include <vector>
#include <cstring>
#include <algorithm>

#define inf 0x3f3f3f3f

#define F first
#define S second

using namespace std;

const int Nmax = 50010;

int n , m , i , x , y , cost;
int D[Nmax];

bool marked[Nmax];

vector < pair < int , int > > g[Nmax];

priority_queue < pair < int , int > > Q;

void dijkstra(int node)
{
    Q.push( {0 , node} );

    memset(D , inf , sizeof(D));

    D[node] = 0;

    while (!Q.empty())
    {
        node = Q.top().S; Q.pop();

        for (i = 0; i < g[node].size() && !marked[node]; ++i)
        {
            int node2 = g[node][i].F; int cost = g[node][i].S;
            if (D[node2] > D[node] + cost)
            {
                D[node2] = D[node] + cost;
                Q.push( { D[node2] , node2 } );
            }
        }

        marked[node] = 1;
    }
}

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

    scanf("%d %d", &n, &m);

    for (i = 1; i <= m; ++i)
    {
        scanf("%d %d %d", &x, &y, &cost);

        g[x].push_back( {y , cost} );
    }

    dijkstra(1);

    for (i = 2; i <= n; ++i)
        (D[i] < inf) ? printf("%d ", D[i]) : printf("0 ");

    return 0;
}