Cod sursa(job #3146530)

Utilizator not_anduAndu Scheusan not_andu Data 21 august 2023 14:44:04
Problema Algoritmul lui Dijkstra Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.66 kb
#include <bits/stdc++.h>
#pragma GCC optimize("O3")

using namespace std;

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

typedef long long ll;

const int VMAX = 50002;
const ll INFINIT = (1 << 31) - 1;

struct Edge {
    int node;
    int price;
};

int n, m;
vector<Edge> adj[VMAX];
bool viz[VMAX];
ll dist[VMAX];

void dijkstra(int source){

    priority_queue<int, vector<int>, greater<int> > q;

    for(int i = 1; i <= n; ++i){
        dist[i] = INFINIT;
    }

    dist[source] = 0;

    q.push(source);

    viz[source] = true;

    while(!q.empty()){

        int node = q.top();

        q.pop();

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

            Edge to = adj[node][i];

            if(dist[node] + to.price < dist[to.node]){

                dist[to.node] = dist[node] + to.price;

                if(!viz[to.node]){

                    q.push(to.node);

                    viz[to.node] = true;

                }

            }

        }

    }

}

void solve(){

    cin >> n >> m;

    for(int i = 0; i < m; ++i){

        int node1, node2, price;
        Edge edge;

        cin >> node1 >> node2 >> price;

        edge.node = node2;
        edge.price = price;

        adj[node1].push_back(edge);

    }

    dijkstra(1);

    for(int i = 2; i <= n; ++i){
        
        if(dist[i] == INFINIT){
            cout << 0 << " ";
        }
        else{
            cout << dist[i] << " ";
        }

    }

}

int main(){
    
    ios_base::sync_with_stdio(false);

    freopen(INFILE, "r", stdin);
    freopen(OUTFILE, "w", stdout);

    cin.tie(nullptr);
    cout.tie(nullptr);

    solve();

    return 0;
}