Cod sursa(job #2518203)

Utilizator roxana.istratePoenaru Roxana roxana.istrate Data 5 ianuarie 2020 12:34:11
Problema Algoritmul lui Dijkstra Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 kb
// Example program
#include <iostream>
#include <string>
#include <algorithm>
#include <queue>
using namespace std;

// i dont like the broken symmetry, a?
struct EdgeInfo {
  int b, w;
  
  EdgeInfo() {}
  EdgeInfo(int b, int w): b(b), w(w) {}
};

class Graph {
public:
    Graph(int V, int E): V(V), E(E), adj_list(V + 1) {}
    
    void add_edge(int a, int b, int w) {
        adj_list[a].push_back(EdgeInfo(b, w));
    }
    // public only bc i need and i dont know about getters yet
    int V, E;
    vector< vector<EdgeInfo> > adj_list;
};

void dijkstra(Graph& g) {
    
    int source = 1;
    
    vector<int> dist(g.V + 1, numeric_limits<int>::max());
    dist[source] = 0;
    
    auto comp = [&](int a, int b) {
        return dist[a] > dist[b];
    };
    
    priority_queue<int, vector<int>, decltype(comp)> q(comp);
    
    q.push(source);
    
    while (!q.empty()) {
        int node = q.top();
        q.pop();
        
        for (int i = 0; i < g.adj_list[node].size(); i++) {
            EdgeInfo& ei = g.adj_list[node][i];
            
            if (dist[ei.b] > dist[node] + ei.w) {
                dist[ei.b] = dist[node] + ei.w;
                q.push(ei.b);
            }
        }
        
    }
    
    for (int i = 2; i < dist.size(); i++) {

        if (dist[i] == numeric_limits<int>::max()) 
            dist[i] = 0;
        
        cout << dist[i] << " ";
    }
    cout << endl;
    
}

int main() {

    freopen("dijkstra.in", "r", stdin);
    freopen("dijkstra.out", "w", stdout);
    
    int V, E, a, b, w;
    cin >> V;
    cin >> E;
    
    Graph g(V, E);
    
    for (int i = 0; i < E; i++) {
        cin >> a;
        cin >> b;
        cin >> w;
        
        g.add_edge(a, b, w);
    }
    
    dijkstra(g);
    
    return 0;
}