Cod sursa(job #2971684)

Utilizator Vlad_NistorNIstor Vlad Vlad_Nistor Data 27 ianuarie 2023 20:09:16
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <bits/stdc++.h>
using namespace std;
#define INF 1e9
vector<pair<int,int>> graf[60005]; /// unul este pentru nodul asociat muchiei iar celalata locatie este alocata pentru cost
int d[60005], c[60005];
int main(void){
    ofstream cout("distante.out");
    ifstream cin("distante.in");
    int T;
    cin >> T;
    while(T--){
        int n,m, s;
        cin >>  n >> m >> s;
        for(int i =1;i<=n;i++){
            cin >> c[i];
        }
        for(int i = 1;i<=m;i++){
            int x, y, z;
            cin >> x >> y >> z;
            graf[x].push_back({z,y});
        }
        for(int i = 1;i<=n;i++){
            d[i] = INF;
        }
        d[s] = 0;
        set<pair<int,int>> st;
        st.insert({0,s});
        while(!st.empty()){
            int k = st.begin() -> second;
            st.erase(st.begin());
            for(auto nod: graf[k]){
                int vec = nod.second;
                int cost = nod.first;
                if(d[vec] > d[k] + cost){ /// acutalizam
                    st.erase({d[vec],vec});
                    d[vec] = d[k] + cost;
                    st.insert({d[vec], vec});
                }
            }
        }
        bool ok = 0;
        for(int i = 2;i<=n;i++){
            if(d[i] != c[i]){
                cout << "NU";
                ok = 1;
                break;
            }
        }
        if(!ok){
            cout << "DA";
        }
        cout << '\n';
        for(int i = 1;i<=n;i++){
            graf[i].clear();
        }
    }
}