Cod sursa(job #2898106)

Utilizator LIR16LazarIonutRadu LIR16 Data 6 mai 2022 00:22:24
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.89 kb
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <set>
#include <vector>

using namespace std;

const int inf = 1 << 30;
const int NMAX = 50005;

struct edge
{
    int dest;
    int cost;
};

struct dist
{
    int node;
    int dist;
};

inline bool operator<(const dist& a, const dist& b)
{
    if (a.dist == b.dist) {
        return a.node < b.node;
    }

    return a.dist < b.dist;
}

int n, m;
vector<edge> adj[NMAX];
int viz[NMAX];
int d[NMAX];
set<dist> s;

void dijkstra(int start_node)
{
    for (int i = 1; i <= n; i++)
    {
        viz[i] = 0;

        if (i != start_node)
            d[i] = inf;
        else
            d[i] = 0;

        s.insert({ i, d[i] });
    }

    while (s.size() > 0)
    {
        int node = (*s.begin()).node;
        if (viz[node] || d[node] == inf)
            break;

        for (auto it = adj[node].begin(); it != adj[node].end(); it++) {
            edge edge_next = *it;

            if (!viz[edge_next.dest] && d[edge_next.dest] > d[node] + edge_next.cost) {
                d[edge_next.dest] = d[node] + edge_next.cost;
                s.insert({ edge_next.dest, d[edge_next.dest] });
            }
        }

        viz[node] = 1;
        s.erase({ node, d[node] });
    }

    // Print lengths.
    for (int i = 1; i <= n; i++) {
        if (i != start_node) {
            if (d[i] == inf)
                cout << 0 << ' ';
            else 
                cout << d[i] << ' ';
        }
    }
}

int main()
{
    freopen("dijkstra.in", "r", stdin);
    freopen("dijkstra.out", "w", stdout);
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

    cin >> n >> m;

    int node1, node2, cost;
    for (int i = 1; i <= m; i++) {
        cin >> node1 >> node2 >> cost;

        adj[node1].push_back({ node2, cost });
    }

    dijkstra(1);
    return 0;
}