Cod sursa(job #1921483)

Utilizator alinp25Alin Pisica alinp25 Data 10 martie 2017 12:53:33
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <fstream>
#include <vector>
#include <queue>
#include <iostream>


#define inf 0x3f3f3f3f


typedef std::pair < int, int > iPair;


void read(std::vector < iPair > v[], int &n) {
    std::ifstream fin("dijkstra.in");
    int x, y, w, m;
    fin >> n >> m;
    for (int i = 0; i < m; i++) {
        fin >> x >> y >> w;
        v[x].push_back(std::make_pair(y, w));
        v[y].push_back(std::make_pair(x, w));
    }
    fin.close();
}


void printSol(std::vector < int > d, int n) {
    std::ofstream fout("dijkstra.out");
    for (int i = 2; i <= n; i++) {
        fout << d[i] << " ";
    }
    fout.close();
}


void solve(std::vector < iPair > v[], std::vector < int > &d, int n) {
    int node, cost, next;
    std::priority_queue < iPair, std::vector < iPair >, std::greater < iPair > > heap;
    std::vector < iPair > :: iterator it;
    d[1] = 0;
    heap.push(std::make_pair(1, 0));
    while (!heap.empty()) {
        node = heap.top().first;
        heap.pop();
        for (int i = 0; i < v[node].size(); i++) {
            next = v[node][i].first;
            cost = v[node][i].second;
            if (d[next] > d[node] +  cost) {
                d[next] = d[node] + cost;
                std::cout << d[next] << " " << next << "\n"                ;
                heap.push(std::make_pair(next, d[next]));
            }
        }
    }
}


int main(int argc, char *argv[]) {
    int n;
    std::vector < int > d(50001, inf);
    std::vector < iPair > v[50001];
    read(v, n);
    solve(v, d, n);
    printSol(d, n);
    return 0;
}