Cod sursa(job #3192701)

Utilizator raresOObreja Rares raresO Data 13 ianuarie 2024 10:35:09
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream f("dijkstra.in");
ofstream g("dijkstra.out");

#define nmax 50003

int n, m;
vector<pair<int, int>> v[nmax];
int fr[nmax];
long long d[nmax];

class comp
{
public:
    bool operator()(int a, int b)
    {
        return d[a] > d[b];
    }
};

priority_queue<int, vector<int>, comp> pq;

int main()
{
    f >> n >> m;
    for (int i = 1; i <= m; ++i)
    {
        int x, y, k;
        f >> x >> y >> k;
        v[x].push_back(make_pair(y, k));
        v[y].push_back(make_pair(x, k));
    }
    for (int i = 2; i <= n; ++i)
    {
        d[i] = -1;
    }
    d[1] = 0;
    pq.push(1);
    for (int i = 1; i <= n; ++i)
    {
        int t = pq.top();
        pq.pop();
        if (!fr[t])
        {
            fr[t] = 1;
            int nr = v[t].size();
            for (int j = 0; j < nr; ++j)
            {
                int next = v[t][j].first;
                int val = v[t][j].second;
                if (!fr[next] && (d[t] + val < d[next] || d[next] == -1))
                {
                    d[next] = d[t] + val;
                    pq.push(next);
                }
            }
        }
    }

    for (int i = 2; i <= n; ++i)
    {
        if (d[i] != -1)
        {
            g << d[i] << ' ';
        }
        else
            g << 0 << ' ';
    }

    return 0;
}