Cod sursa(job #3040471)

Utilizator DordeDorde Matei Dorde Data 29 martie 2023 21:51:47
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include<fstream>
#include<vector>
#include<queue>

#define pii pair<int,int>
#define fi first
#define se second
using namespace std;
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");
int const N = 250003;
struct edge{
    int x , y , w;
    edge(){}
    edge(int _x , int _y , int _w) : x(_x) , y(_y) , w(_w){}
    int oth(int _x){
        return (x ^ y ^ _x);
    }
}mc[N];
int n , m , a , b , c;
int dp[N];
vector<int> v[N];
void dijkstra(){
    fill(dp + 1 , dp + 1 + n , (1 << 30));
    priority_queue<pii> h;
    h.emplace(0 , 1);
    dp[1] = 0;
    while(!h.empty()){
        int x = h.top().se;
        int w = -h.top().fi;
        h.pop();
        if(w != dp[x])
            continue;
        for(int e : v[x]){
            int y = mc[e].oth(x);
            if(dp[y] > dp[x] + mc[e].w){
                dp[y] = dp[x] + mc[e].w;
                h.emplace(-dp[y] , y);

            }
        }
    }
}
int main(){
    fin >> n >> m;
    for(int i = 1 ; i <= n ; ++ i){
        fin >> a >> b >> c;
        mc[i] = {a , b , c};
        v[a].push_back(i);
        v[b].push_back(i);
    }
    dijkstra();
    for(int i = 2 ; i <= n ; ++ i)
        fout << (dp[i] == (1 << 30) ? 0 : dp[i]) << ' ';
    fout << '\n';
    return 0;
}