Cod sursa(job #1888312)

Utilizator al.mocanuAlexandru Mocanu al.mocanu Data 22 februarie 2017 00:42:13
Problema Algoritmul lui Dijkstra Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.93 kb
#include <iostream>
#include <vector>
#include <queue>
using namespace std;

const int MAX = 50005;
const int INF = 1<<30;
typedef pair<int, int> pii;

class Graph{
    int n;
    vector<vector<pii>> l;
public:
    Graph(int n){
        this->n = n;
        l.resize(n + 1);
    }

    int getN() {return n;}
    int getNodeListSize(int node) {return l[node].size();}
    int getEdgeNode(int node, int pos) {return l[node][pos].first;}
    int getEdgeCost(int node, int pos) {return l[node][pos].second;}
    void addEdge(int node1, int node2, int cost){
        l[node1].push_back(make_pair(node2, cost));
    }
};

struct compar{
    bool operator() (pii a, pii b) {return a.second > b.second;}
};

vector<int> dijkstra(Graph* g, int s){
    bool viz[g->getN() + 1];
    vector<int> d;
    d.resize(g->getN() + 1);
    priority_queue<pii, vector<pii>, compar> q;
    for(int i = 1; i <= g->getN(); ++i){
        viz[i] = 0;
        d[i] = INF;
    }
    d[s] = 0;

    q.push(make_pair(s, d[s]));
    while(!q.empty()){
        int node = q.top().first;
        q.pop();

        if(viz[node])
            continue;
        viz[node] = 1;
        for(int i = 0; i < g->getNodeListSize(node); ++i)
            if(!viz[g->getEdgeNode(node, i)])
                if(d[g->getEdgeNode(node, i)] > d[node] + g->getEdgeCost(node, i)){
                    d[g->getEdgeNode(node, i)] = d[node] + g->getEdgeCost(node, i);
                    q.push(make_pair(g->getEdgeNode(node, i), d[g->getEdgeNode(node, i)]));
                }
    }

    return d;
}

int main(){
    freopen("dijkstra.in", "r", stdin);
    freopen("dijkstra.out", "w", stdout);
    int n, m, x, y, z;
    cin >> n >> m;
    Graph* g = new Graph(n);
    for(int i = 0; i < m; ++i){
        cin >> x >> y >> z;
        g->addEdge(x, y, z);
    }

    vector<int> res = dijkstra(g, 1);
    for(int i = 2; i <= g->getN(); ++i)
        cout << (res[i] == INF ? 0 : res[i]) << " ";
    cout << endl;
    return 0;
}