Cod sursa(job #1060136)

Utilizator Alexghita96Ghita Alexandru Alexghita96 Data 17 decembrie 2013 17:31:52
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <cstdio>
#include <vector>
#include <queue>

#define Nmax 50005
#define INF 0x3f3f3f3f / 2

using namespace std;

int N, M, B[Nmax], D[Nmax];
vector <pair <int, int> > A[Nmax];

priority_queue <pair <int, int>, vector <pair <int, int> >, greater <pair <int, int> > > Q;

void Citire()
{
    int a, b, c;
    scanf("%d %d", &N, &M);
    for (int i = 1; i <= M; ++i)
    {
        scanf("%d %d %d", &a, &b, &c);
        A[a].push_back(make_pair(c, b));
        B[a]++;
    }
    for (int i = 2; i <= N; ++i)
        D[i] = INF;
}

void Rezolvare()
{
    int vf, vecin;
    Q.push(make_pair(0, 1));
    while (!Q.empty())
    {
        vf = Q.top().second;
        Q.pop();
        for (int i = 0; i < B[vf]; ++i)
        {
            vecin = A[vf][i].second;
            if (D[vecin] > D[vf] + A[vf][i].first)
            {
                D[vecin] = D[vf] + A[vf][i].first;
                Q.push(make_pair(D[vecin], A[vf][i].second));
            }
        }
    }
}

void Afisare()
{
    for (int i = 2; i <= N; ++i)
        printf("%d ", D[i]);
}

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

    Citire();
    Rezolvare();
    Afisare();

    return 0;
}