Cod sursa(job #2499363)

Utilizator EduardTudosaEduard Bogdan EduardTudosa Data 25 noiembrie 2019 22:50:02
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#define pinf 20000000
#define NM 100005

using namespace std;

ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");

int n , m , p , d[NM] , v[NM];

struct arc
{
    int a , c;
};

vector <arc> G[NM];

bool compar(int x , int y)
{
    return (d[x] > d[y]);
}

priority_queue < int , vector <int> , bool (*)(int , int) > q(compar);

void citire()
{
    fin >> n >> m;
    int x , y;
    arc aux;
    for(int i = 1 ; i <= m ; i ++)
    {
        fin >> x >> y >> aux.c;
        aux.a = x;
        G[y].push_back(aux);
        aux.a = y;
        G[x].push_back(aux);
    }
}

void dijkstra()
{
    int k , lg;
    for(int i = 1 ; i <= n ; i ++)
        d[i] = pinf;
    d[1] = 0;
    v[1] = 1;
    q.push(1);
    while(!q.empty())
    {
        k = q.top();
        q.pop();
        v[k] = 0;
        for(int i = 0 ; i < G[k].size() ; i ++)
        {
            int r = G[k][i].a;
            int cost = G[k][i].c;
            lg = cost + d[k];
            if(d[r] > lg)
            {
                d[r] = lg;
                if(v[r] == 0)
                {
                    v[r] = 1;
                    q.push(r);
                }
            }
        }
    }
}

void afisare()
{
    for(int i = 2 ; i <= n ; i ++)
        fout << d[i] << ' ';
}

int main()
{
    citire();
    dijkstra();
    afisare();
    return 0;
}