Cod sursa(job #1977763)

Utilizator misu007Pogonaru Mihai misu007 Data 6 mai 2017 00:24:02
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;

typedef pair<int, int> Pair;
typedef pair<int*, int> PairHeap;

class Comapare {
    public:
    bool operator()(const PairHeap& a, const PairHeap& b) {
        return *a.first > *b.first;
    }
};

int V, E;
vector<vector<Pair>> edges;
priority_queue<PairHeap, vector<PairHeap>, Comapare> heap;

vector<int> len;
vector<bool> inHeap;

void read() {
    int v, v1, c;
    scanf("%d%d", &V, &E);
    edges.resize(V);
    len.resize(V, -1);
    inHeap.resize(V, false);
    for (int i = 0; i < E; ++i) {
        scanf("%d%d%d", &v, &v1, &c);
        edges[v - 1].push_back(Pair(v1 - 1, c));
    }
}

void solve(int v) {
    PairHeap aux;
    len[v] = 0;
    heap.push(PairHeap(&len[v], v));
    inHeap[v] = true;

    while(!heap.empty()) {
        aux = heap.top();
        heap.pop();
        inHeap[aux.second] = false;
        for (auto e : edges[aux.second]) {
            if (len[e.first] == -1 || len[e.first] > *aux.first + e.second) {
                len[e.first] = *aux.first + e.second;
                if(!inHeap[e.first]) {
                    heap.push(PairHeap(&len[e.first], e.first));
                    inHeap[e.first] = true;
                }
            }
        }
        // update heap
        int x = -1;
        heap.push(PairHeap(&x, x));
        heap.pop();
    }
}

void write() {
    for (unsigned i = 1; i < len.size(); ++i) {
        printf("%d ", (len[i] == -1 ? 0 : len[i]));
    }
    printf("\n");
}

int main()
{
    freopen("dijkstra.in", "r", stdin);
    freopen("dijkstra.out", "w", stdout);
    read();
    solve(0);
    write();
    return 0;
}