Cod sursa(job #3296313)

Utilizator Iustin_Mircea2010Iustin Mircea Iustin_Mircea2010 Data 12 mai 2025 11:52:18
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#include <bits/stdc++.h>
#define int long long
using namespace std;

const int nmax = 5e4 + 1, inf = 1e17;

struct Edge{
    int cost, to;
    bool operator <(const Edge &x) const{
        return cost < x.cost;
    }
    bool operator >(const Edge &x) const{
        return cost > x.cost;
    }
};

vector<Edge> adj[nmax];
int takes[nmax];
int cmin[nmax];
priority_queue< pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>> > pq;

void solve(int start, int n){
    pq.push({0, start});
    for(int i = 1; i <= n; i++){
        if(i == start) continue;
        pq.push({inf, i});
    }
    while(!pq.empty()){
        int curr = pq.top().second;
        int C = pq.top().first;
        pq.pop();
        if(cmin[curr] != C) continue;
        //s.erase(s.begin());
        for(auto [x, y] : adj[curr]){
            if(cmin[y] > C + x){
                takes[y] = curr;
                cmin[y] = C + x;
                pq.push({cmin[y], y});
            }
        }
    }
}

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

    int n, m, a, b, c, start = 1;
    fin >> n >> m;
    for(int i = 1; i <= m; i++){
        fin >> a >> b >> c;
        adj[a].push_back({c, b});
    }
    for(int i = 1; i <= n; i++)
        cmin[i] = inf;
    cmin[start] = 0;
    takes[start] = -1;
    solve(start, n);

    for(int i = 2; i <= n; i++){
        //if(i == start) continue;
        if(cmin[i] == inf)
            fout << 0 << " ";
        else
            fout << cmin[i] << " ";
    }

    return 0;
}