Cod sursa(job #3194133)

Utilizator not_anduAndu Scheusan not_andu Data 17 ianuarie 2024 08:57:00
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 kb
#include <bits/stdc++.h>
#pragma GCC optimize "03"

using namespace std;

#define INFILE "dijkstra.in"
#define OUTFILE "dijkstra.out"

const int N_MAX = 50005;
const int INF = 1e18;

struct Node {

    int node;
    int price;

    Node() : node(0), price(0) {}
    Node(int _node, int _price) : node(_node), price(_price) {}

    bool operator<(const Node &other) const {
        return (this -> price < other.price);
    }

};

int nodes, edges;
int dist[N_MAX];
bool visited[N_MAX];
vector<Node> adj[N_MAX];

void dijkstra(int source){

    for(int i = 1; i <= nodes; ++i) dist[i] = INF;
    dist[source] = 0;

    priority_queue<Node> q;
    q.push(Node(1, 0));

    while(!q.empty()){

        int node = q.top().node;
        int price = q.top().price;

        q.pop();

        if(dist[node] != price) continue;

        for(int i = 0; i < adj[node].size(); ++i){

            Node to = adj[node][i];
            if(price + to.price < dist[to.node]){
                dist[to.node] = price + to.price;
                q.push(Node(to.node, dist[to.node]));
            }

        }

    }

}

void solve(){

    cin >> nodes >> edges;

    for(int i = 0; i < edges; ++i){
        int node1, node2, price; cin >> node1 >> node2 >> price;
        adj[node1].push_back(Node(node2, price));
    }

    dijkstra(1);

    for(int i = 2; i <= nodes; ++i){
        cout << (dist[i] != INF ? dist[i] : 0) << '\n';
    }

}

int main(){
    ios_base::sync_with_stdio(false);
    freopen(INFILE, "r", stdin);
    freopen(OUTFILE, "w", stdout);
    cin.tie(0), cout.tie(0);
    solve();
    return 0;
}