Cod sursa(job #2963284)

Utilizator WindowsPhoneSerban Pirvulescu WindowsPhone Data 10 ianuarie 2023 18:44:09
Problema Algoritmul lui Dijkstra Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");

const int mx = 2000000005;
int n, m, st = 1;
int d[100005]; bool w[100005];
vector<pair<int, int>> v[100005];

int edge(int a, int b) {
    for (int i=0;i<v[a].size();i++) {
        if (v[a][i].first == b)
            return v[a][i].second;
    }
    
    return 0;
}

int main() {
    fin >> n >> m;
    
    for (int i=1;i<=m;i++) {
        int x, y, z;
        fin >> x >> y >> z;
        
        v[x].push_back({y, z});
    }
    
    for (int i=1;i<=n;i++)
        d[i] = mx;
    
    // Dijkstra
    priority_queue<pair<int, int>, vector<pair<int, int>>, function<bool(pair<int, int>, pair<int, int>)>  >
            q([](pair<int, int> a, pair<int, int> b) -> bool {
                return a.first > b.first;
            });
    
    d[st] = 0;
    q.push({0, st});
    while (!q.empty()) {
        int x = q.top().second, dx = q.top().first;
        q.pop();
        
        if (w[x])
            continue;
        
        /*cout << x << ": ";
        for (int i=1;i<=n;i++)
            cout << (d[i] == mx ? -1 : d[i]) << " ";
        cout << "\n";*/
        
        w[x] = true;
        
        for (int i=0;i<v[x].size();i++) {
            int cost = d[x] + edge(x, v[x][i].first);
            
            if (!w[v[x][i].first] && cost < d[v[x][i].first]) {
                d[v[x][i].first] = cost;
                
                q.push({cost, v[x][i].first});
            }
        }
    }
    
    for (int i=2;i<=n;i++)
        fout << (d[i] == mx ? 0 : d[i]) << " ";
    return 0;
}