Cod sursa(job #2275548)

Utilizator andreiomd1Onut Andrei andreiomd1 Data 3 noiembrie 2018 11:56:27
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#include <bits/stdc++.h>

using namespace std;

const int NMAX=5e4+5;

int N, M, i, j, X, Y, C, Sol[NMAX], nod, cnt;

bool Sel[NMAX];

vector <pair< int, int> > G[NMAX];

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

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, &C);

        G[X].push_back({Y, C});
    }

    for(i=2; i<=N; i++)
        Sol[i]=-1;

    Sel[1]=true;

    for(i=0; i<G[1].size(); i++)
    {
        H.push({G[1][i].second, G[1][i].first});

        Sol[G[1][i].first]=G[1][i].second;
    }

    cnt=G[1].size();


    while(cnt)
    {
        while(Sel[H.top().second]==true)
            H.pop();

        nod=H.top().second;

        Sel[nod]=true;

        H.pop();

        cnt--;

        ///c == nod

        for(i=0; i<G[nod].size(); i++)
        {
            j=G[nod][i].first;

            if(Sol[j]==-1)
            {
                cnt++;

                H.push({Sol[nod]+G[nod][i].second, j});

                Sol[j]=Sol[nod]+G[nod][i].second;
            }
            else
            {
                if(Sol[j] > Sol[nod]+G[nod][i].second)
                {

                    H.push({Sol[nod]+G[nod][i].second, j});

                    Sol[j]=Sol[nod]+G[nod][i].second;
                }
            }
        }
    }

    for(i=2; i<=N; i++)
        if(Sol[i]!=-1)
            printf("%d ", Sol[i]);
        else printf("%d ", 0);

    printf("\n");

    return 0;
}