Cod sursa(job #2577261)

Utilizator vali_27Bojici Valentin vali_27 Data 8 martie 2020 21:00:23
Problema Algoritmul lui Dijkstra Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
#include <iostream>
#include <queue>
#define NMAX 100001
#define inf 10000000

using namespace  std;

typedef pair <int,int> iPair;
vector < vector < iPair > > la;

int n,m;

void citire()
{
    freopen("dijkstra.in","r",stdin);
    freopen("dijkstra.out","w",stdout);
    scanf("%d %d",&n,&m);
    la.resize(n+1);

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

void dijsktra()
{
    priority_queue < iPair, vector <iPair>, greater <iPair> >pq;
    bool used[50005] = {0};
    int dist[50005];

    for(int i=1; i<=n; ++i)
        dist[i] = inf;

    dist[1] = 0;
    pq.push(make_pair(0,1)); // dist si nod

    while(!pq.empty())
    {
        int v = pq.top().second;
        int dv = pq.top().first;
        pq.pop();

//        if(used[v] == 1)
//            continue;
//        used[v] = 1;

        vector <iPair>::iterator it;
        for(it = la[v].begin(); it!=la[v].end(); ++it)
        {
            int vecin = (*it).first;
            int dvecin = (*it).second;

            if(dist[vecin] > dv + dvecin)
            {
                dist[vecin] = dv + dvecin;
                pq.push(make_pair(dist[vecin], vecin));
            }
        }
    }

    for(int i=2; i<=n; ++i)
        if(dist[i] == inf)
            printf("0 ");
        else
            printf("%d ",dist[i]);
}

int main()
{
    citire();
    dijsktra();
}