Cod sursa(job #2766033)

Utilizator davidg0022Gatea David davidg0022 Data 30 iulie 2021 20:21:31
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.47 kb
#include<vector>
#include<fstream>
#include<queue>
#include<algorithm>
using namespace std;

ifstream cin("distante.in");
ofstream cout("distante.out");

#define INF 0x3f3f3f3f
typedef pair<int, int> iPair;

int t, n, m, p;
void dijkstra(int start,vector<iPair>*G,vector<int>&D){
    priority_queue<iPair, vector<iPair>, greater<iPair>> Q;
    Q.push(make_pair(0, start));
    D[start] = 0;
    while(!Q.empty()){
        int node = Q.top().second;
        if(Q.top().first>D[node]){
                Q.pop();
                continue;
        }
        Q.pop();
        for(auto i:G[node]){
            int v = i.first;
            int weight=i.second;
            if(D[v]>D[node]+weight){
                D[v] = D[node] + weight;
                Q.push(make_pair(D[v], v));
            }
        }
    }
}

void read(){

    cin >> n >> m >> p;
    vector<iPair> *G;
    vector<int> Sir;
    vector<int> D;
    D = vector<int>(n + 1, INF);
    G = new vector<iPair>[n + 1];
    Sir = vector<int>(n + 2);
    for (int x, i = 1; i <= n;i++)
        cin >> x,
        Sir[i] = x;

    for (int x, y, w, i = 1; i <= m; i++)
            cin >> x>> y>> w,
            G[x].push_back(make_pair(y, w));
    dijkstra(p,G,D);
    for (int i = 1; i <= n;i++)
        if(D[i]!=Sir[i]){
            cout << "NU" << '\n';
            return;
        }
    cout << "DA" << '\n';
}

int main(){
    cin >> t;
    for (int i = 1; i <= t;i++)
        read();
}