Cod sursa(job #2791227)

Utilizator crysstyanIacob Paul Cristian crysstyan Data 30 octombrie 2021 11:28:03
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.39 kb
#include <bits/stdc++.h>
#define NMAX 50002

using namespace std;

ifstream f("dijkstra.in");
ofstream g("dijkstra.out");

vector < pair < int, int > > v[NMAX];
vector < pair < int, int > > q; // un element => { x - nod, cost minim momentan din nodul 1 pana in nodul x }
bool visited[NMAX];
int n, m, d[NMAX];

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

priority_queue < pair < int, int >, vector < pair < int, int > >, comp > pq;

void insert_element(pair < int, int > x)
{
    q.push_back(x);
}

// urmatorul element e de fapt elementul cu cel mai mic cost momentan
// returneaza indexul la care se afla elementul respectiv
int get_next_element()
{
    int minim = q[0].second;
    int min_index = 0;

    for (int i = 0; i < q.size(); ++ i) {
        if (q[i].second < minim) {
            minim = q[i].second;
            min_index = i;
        }
    }

    return min_index;
}

void delete_element(int index)
{
    q.erase(q.begin() + index);
}

bool is_structure_empty()
{
    return q.size() == 0;
}

void dijkstra() {
    d[1] = 0;
    //insert_element({1, 0});
    pq.push({1, 0});

    //while (!is_structure_empty()) {
    while (!pq.empty()) {
        //int curr_index = get_next_element();
        //pair < int, int > curr = q[curr_index];
        //delete_element(curr_index);
        pair < int, int > curr = pq.top();
        pq.pop();

        if (!visited[curr.first]) {
            visited[curr.first] = 1;

            for (auto it : v[curr.first]) {
                if (!visited[it.first] && d[it.first] > d[curr.first] + it.second) { // dp[i] = min(dp[tata] + 1, dp[i])
                    d[it.first] = d[curr.first] + it.second;
                    //insert_element({it.first, d[it.first]});
                    pq.push({it.first, d[it.first]});
                }
            }
        }
    }
}

int main()
{
    f >> n >> m;

    for (int i = 0; i < m; ++ i) {
        int x, y, cost;

        f >> x >> y >> cost;
        v[x].push_back({y, cost});
    }

    for (int i = 2; i <= n; ++ i) {
        d[i] = 2000000000;
    }

    dijkstra();

    for (int i = 2; i <= n; ++ i) {
        if (d[i] == 2000000000) {
            g << "0 ";
        } else {
            g << d[i] << " ";
        }
    }

    g << '\n';
    return 0;
}