Cod sursa(job #1236881)

Utilizator Alexghita96Ghita Alexandru Alexghita96 Data 2 octombrie 2014 19:01:40
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <cstdio>
#include <vector>
#include <queue>

#define NMAX 50005
#define INF 0x3f3f3f3f / 2

using namespace std;

int N, M, cost[NMAX];
vector <pair <int, int> > G[NMAX];
priority_queue <pair <int, int>, vector <pair <int, int> >, greater <pair <int, int> > > Q;

void citire()
{
    int x, y, c;

    scanf("%d %d", &N, &M);

    for (int i = 1; i <= M; ++i)
    {
        scanf("%d %d %d", &x, &y, &c);
        G[x].push_back(make_pair(c, y));
    }

    for (int i = 2; i <= N; ++i)
        cost[i] = INF;
}

void rezolvare()
{
    int vf;
    vector <pair <int, int> > :: iterator it;

    Q.push(make_pair(0, 1));

    while (!Q.empty())
    {
        vf = Q.top().second;
        Q.pop();
        for (it = G[vf].begin(); it != G[vf].end(); ++it)
        {
            if (cost[it -> second] > cost[vf] + it -> first)
            {
                cost[it -> second] = cost[vf] + it -> first;
                Q.push(make_pair(cost[it -> second], it -> second));
            }
        }
    }
}

void afisare()
{
    for (int i = 2; i <= N; ++i)
        if (cost[i] == INF)
            printf("0 ");
        else
            printf("%d ", cost[i]);
}

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

    citire();
    rezolvare();
    afisare();

    return 0;
}