Cod sursa(job #3227045)

Utilizator ANNOnymousMihaila Stefan-Alexandru ANNOnymous Data 24 aprilie 2024 17:38:33
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <bits/stdc++.h>
#define Nmax 50001
#define INF 1 << 30

using namespace std;

ifstream fin("distante.in");
ofstream fout("distante.out");

int n, m, s;
vector<pair<int, int>> G[Nmax];
int dist[Nmax];
int viz[Nmax];
int dist_prob[Nmax];

struct compare {

    bool operator() (int a, int b) {
        return dist[a] > dist[b];
    }
};

void Dijkstra(int start) {

    priority_queue<int , vector<int>, compare> Q;
    viz[start] = 1;
    dist[start] = 0;
    Q.push(start);

    while(!Q.empty()) {

        int nod = Q.top();
        viz[nod] = 0;
        Q.pop();

        for (auto it: G[nod]) {

            int vecin = it.first;
            int cost = it.second;

            if (dist[nod] + cost < dist[vecin]) {

                dist[vecin] = dist[nod] + cost;
                if (!viz[vecin]) {

                    Q.push(vecin);
                    viz[vecin] = 1;

                }

            }

        }

    }

}

int main() {

    short int t;
    fin >> t;
    for (int i = 1; i <= t; i ++) {
        fin >> n >> m >> s;
        for (int i = 1; i <= n; i ++)
            fin >> dist_prob[i], G[i].clear();
        while(m -- ) {
            int x, y, cost;
            fin >> x >> y >> cost;
            G[x].push_back({y, cost});
            G[y].push_back({x, cost});
        }
        for (int i = 1; i <= n; i ++)
            dist[i] = INF, viz[i] = 0;
        Dijkstra(s);
        int ok = 1;
        for (int i = 1; i <= n; i ++) {
            if (dist[i] != dist_prob[i]) {
                ok = 0;
                fout << "NU" << '\n';
                break;
            }
        }
        if (ok)
            fout << "DA" << '\n';
    }
}