Cod sursa(job #3311657)

Utilizator amavutsiviatamaulachitgaboriipetrusifilip amavutsiviata Data 23 septembrie 2025 16:56:24
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.95 kb
#include <bits/stdc++.h>

using namespace std;

struct gngtstuff
{
    pair<int, int> heap[100005];
    int siz = 0;
    pair<int, int> get_max()
    {
        return heap[1];
    }
    int stanga(int ind)
    {
        return ind << 1;
    }
    int dreapta(int ind)
    {
        return (ind << 1) + 1;
    }
    int daddy(int ind)
    {
        return ind >> 1;
    }
    void add(int val, int indice)
    {
        heap[++siz] = {val, indice};
        int nod = siz;
        while (nod != 1)
        {
            int tmp = daddy(nod);
            if (heap[nod] > heap[tmp])
            {
                swap(heap[nod], heap[tmp]);
                nod = tmp;
            }
            else break;
        }
    }
    void pop()
    {
        swap(heap[1], heap[siz]);
        siz--;
        int nod = 1;
        while (nod <= siz)
        {
            int tmp1 = stanga(nod), tmp2 = dreapta(nod);
            if (heap[tmp1] < heap[tmp2]) swap(tmp1, tmp2);
            if (heap[tmp1] > heap[nod]) nod = tmp1;
            else break;
        }
    }
};

gngtstuff sybau;
int ans[100005];
vector<pair<int, int>> edges[100005];

int main()
{
    ifstream cin("dijkstra.in");
    ofstream cout("dijkstra.out");
    int n, m, i;
    cin >> n >> m;
    for (i = 1; i <= m; i++)
    {
        int x, y, e;
        cin >> x >> y >> e;
        edges[x].push_back({y, e});
    }
    for (i = 2; i <= n; i++) ans[i] = 1e9;
    sybau.add(0, 1);
    while (sybau.siz != 0)
    {
        int a = sybau.heap[1].second, b = -sybau.heap[1].first;
        sybau.pop();
        for (i = 0; i < edges[a].size(); i++)
        {
            int where = edges[a][i].first, how = b + edges[a][i].second;
            if (how < ans[where])
            {
                ans[where] = how;
                sybau.add(-how, where);
            }
        }
    }
    for (i = 2; i <= n; i++) cout << ans[i] << ' ';
    return 0;
}