Cod sursa(job #2866768)

Utilizator adiaioanaAdia R. adiaioana Data 9 martie 2022 22:54:16
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <fstream>
#include <vector>
#include <queue>
#define inf 1000000100
#define Nmax 50500
#define pb push_back
using namespace std;
ifstream cin("dijkstra.in");
ofstream cout("dijkstra.out");

bool ok[Nmax];
int d[Nmax], N, p;
struct compare
{
    bool operator() (int x, int y)
    {
        return d[x]>d[y];
    }
};///e pe invers asta aparent
priority_queue <int, vector<int>,compare> pq;
vector < pair<int,int> > G[Nmax];

inline void daicstra();
int main()
{
    int M,x,y,z;
    cin>>N>>M;
    for(int i=1; i<=M; ++i)
    {
        cin>>x>>y>>z;
        G[x].pb({y,z});
        G[y].pb({x,z});
    }

    for(int i=1; i<=N; ++i)
            d[i]=inf;
    d[p=1]=0;
    daicstra();

    for(int i=1; i<=N; ++i)
        if(i!=p)
            cout<<d[i]<<' ';
    cout<<'\n';
    return 0;
}

inline void daicstra() ///asa se citeste pentru cei care nu stiau
{
    int acc, nn, nd;
    ok[p]=1;
    pq.push(p);
    while(!pq.empty())
    {
        acc=pq.top(); pq.pop();
        ok[acc]=0;
        for(auto it:G[acc])
        {
            nn=it.first;
            nd=d[acc]+it.second;
            if(nd<d[nn])
            {
                d[nn]=nd;
                if(ok[nn]==0)
                {
                    ok[nn]=1;
                    pq.push(nn);
                }
            }
        }
    }
}