Cod sursa(job #2960217)

Utilizator GeorgeNistorNistor Gheorghe GeorgeNistor Data 3 ianuarie 2023 19:23:41
Problema Algoritmul Bellman-Ford Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
/*
 * https://www.infoarena.ro/problema/dijkstra
 * Complexity: O(E*logV)
 */

#include <bits/stdc++.h>

using namespace std;

ifstream in("dijkstra.in");
ofstream out("dijkstra.out");

int V, E, s;
vector<vector<pair<int, int>>> adjList;
vector<int> dist, parrent;

void init(){
    s = 1;
    adjList.resize(V+1);
    dist.resize(V+1, INT_MAX);
    parrent.resize(V+1);
    dist[s] = parrent[s] = 0;
}
void read(){
    in >> V >> E;
    init();
    for(int i = 1; i <= E; i++){
        int u, v, w;
        in >> u >> v >> w;
        adjList[u].emplace_back(v, w);
    }
}

void dijkstra(){
    priority_queue<pair<int, int>> q;
    vector<bool> visited(V+1);
    q.push({dist[s], s});
    visited[s] = true;
    while(!q.empty()){
        int u = q.top().second;
        q.pop();
        for(auto edge: adjList[u]){
            int v, w;
            v = edge.first;
            w = edge.second;
            if(visited[v])
                continue;
            if(dist[u]+w < dist[v]){
                dist[v] = dist[u]+w;
                parrent[v] = u;
                q.push({-dist[v], v});
                visited[v] = true;
            }
        }
    }
}

void print(){
    for(int u = 1; u <= V; u++){
        cout << u <<  ": ";
        for(auto edge: adjList[u]) {
            int v, w;
            v = edge.first;
            w = edge.second;
            cout << "{" << v << ", " << w << "} ";
        }
        cout << endl;
    }
}

int main() {
    read();
    dijkstra();
    for(int u = 2; u <= V; ++u) {
        if (dist[u] == INT_MAX)
            out << "0 ";
        else
            out << dist[u] << ' ';
    }

    return 0;
}