Cod sursa(job #2711627)

Utilizator Rares09Rares I Rares09 Data 24 februarie 2021 15:23:25
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <fstream>
#include <vector>
#include <bitset>
#include <queue>

using namespace std;
ifstream cin("dijkstra.in");
ofstream cout("dijkstra.out");

int sum, nrsol, a[250005], b[250005], c[250005], cos[250005];
vector <int> e[50005];
priority_queue <pair <int, int>, vector<pair <int, int> >, greater<pair <int, int> > > edges;
bitset <50005> added;
int main()
{
    int n, m;
    cin >> n >> m;

    for(int i = 1; i <= m; ++i)
    {
        cin >> a[i] >> b[i] >> c[i];
        e[a[i]].push_back(i);
    }

    added[1] = true;

    for(auto it = e[1].begin(); it != e[1].end(); ++it)
    {
        edges.push({c[*it], *it});
    }

    while(!edges.empty())
    {
        int i = edges.top().second;

        if(added[a[i]] == true && added[b[i]] == true)
        {
            edges.pop();
            continue;
        }

        int x;

        if(added[a[i]] == false)
            x = a[i];
        else
            x = b[i];

        added[x] = true;
        cos[x] = edges.top().first;
        edges.pop();

        for(auto it = e[x].begin(); it != e[x].end(); ++it)
        {
            if(added[a[*it]] == true && added[b[*it]] == true)
                continue;

            edges.push({c[*it] + cos[x], *it});
        }
    }

    for(int i = 2; i <= n; ++i)
    {
        cout << cos[i] << ' ';
    }

    return 0;
}