Cod sursa(job #1902676)

Utilizator Train1Train1 Train1 Data 4 martie 2017 18:46:15
Problema Algoritmul lui Dijkstra Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define MAX_VALUE 999999999
using namespace std;
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");
vector <vector <pair<int, int> > > a;
vector <bool> selectat;
//vector <int> root;
vector <int> d;
int n, m;

priority_queue<pair<int, int> > pq;

struct comp
{
    bool operator() (pair<int, int> &a, pair<int, int> &b)
    {
        return a.second < b.second;
    }
};

/*
int searchNod() {
    int min = MAX_VALUE, aux = 0;
    for (int i = 1; i <= n; i++) {
        if(d[i] < min && selectat[i] == false) {
            aux = i;
            min = d[i];
        }
    }
    return aux;
}
*/
int main()
{
    fin>>n>>m;
    int x, y, z;
    d.resize(n + 1, MAX_VALUE);
    selectat.resize(n + 1);
    a.resize(n + 1);
    for (int i = 1; i <= m; i++) {
        fin>>x>>y>>z;
        a[x].push_back(make_pair(y, z));
    }


    int k = 1;
    d[k] = 0;
    pq.push(make_pair(k, d[k]));

    while(!pq.empty()) {

        pair<int, int> nextNode = pq.top();
        pq.pop();
        k = nextNode.first;
        if (nextNode.second > d[k])
            continue;

        //selectat[k] = true;
        for (int i = 0; i < a[k].size(); i++) {
            if(d[k] + a[k][i].second < d[a[k][i].first]) {
                d[a[k][i].first] = d[k] + a[k][i].second;
                pq.push(make_pair(a[k][i].first, d[a[k][i].first]));
            }
        }
    }

    for (int i = 2; i < d.size(); i++) {
        if(d[i] != MAX_VALUE)
        fout<<d[i]<<' ';
        else
        fout<<"0 ";
    }
    fin.close();
    fout.close();
    return 0;
}