Cod sursa(job #3275260)

Utilizator BledeaAlexBledea Alexandru BledeaAlex Data 9 februarie 2025 16:04:15
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.65 kb
#include <bits/stdc++.h>

using namespace std;

const int N_MAX = 5e4 + 5, M_MAX = 25e4 + 5, INF = 1 << 28;
int N, M;
int dist[N_MAX];
bitset<N_MAX> inQueue;

struct Edge
{
    int v, c;

    Edge(int _v, int _c) :
        v(_v), c(_c) {}

    Edge() {}
};

struct PQCmp
{
    inline bool operator()(const int& a, const int& b)
    {
        return dist[a] > dist[b];
    }
};

vector<Edge> G[N_MAX];

void SetInput(string name)
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    (void)!freopen((name + ".in").c_str(), "r", stdin);
    (void)!freopen((name + ".out").c_str(), "w", stdout);
}

void ReadInput()
{
    cin >> N >> M;

    for(int i = 0, v1, v2, c; i < M; i++)
    {
        cin >> v1 >> v2 >> c;
        G[v1].emplace_back(v2, c);
    }
}

void Dijkstra(int start)
{
    priority_queue<int, vector<int>, PQCmp> PQ;

    for(int i = 1; i <= N; i++)
        dist[i] = INF;

    PQ.push(start);
    dist[start] = 0;
    inQueue[start] = 1;

    int V;
    while(not PQ.empty())
    {
        V = PQ.top();
        PQ.pop();

        inQueue[V] = 0;

        for(Edge fiu : G[V])
            if(dist[fiu.v] > dist[V] + fiu.c)
            {
                dist[fiu.v] = dist[V] + fiu.c;

                if(not inQueue[fiu.v])
                {
                    PQ.push(fiu.v);
                    inQueue[fiu.v] = 1;
                }
            }
    }

    for(int i = 2; i <= N; i++)
    {
        if(dist[i] == INF) dist[i] = 0;
        cout << dist[i] << ' ';
    }
}

int main()
{
    SetInput("dijkstra");

    ReadInput();
    Dijkstra(1);

    return 0;
}