Cod sursa(job #2576710)

Utilizator Ioan_AnghelIoan Anghel Ioan_Anghel Data 6 martie 2020 21:56:08
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

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

struct edge{
    int dest, dist;
};

class cmp
{
public:
    bool operator() (edge a, edge b){
        return a.dist > b.dist;
    }
};

const int N = 50005, M = 10006, INF = (1 << 30) - 1;
int d[N], dist[N], n;

vector <edge> g[N];
priority_queue <edge, vector <edge>, cmp> q;

void citire(int n, int m)
{
    for(int i = 1; i <= n; i++){
        in >> dist[i];
    }
    for(int i = 0; i <= m; i++){
        int a, b, c;
        in >> a >> b >> c;
        g[a].push_back(edge{b, c});
    }
}

bool comparare()
{
    for(int i = 1; i <= n; i++){
        if(d[i] != dist[i]){
            return false;
        }
    }
    return true;
}

int main()
{
    int T, a= 0;
    in >> T;
    while(a < T){
        int m, p;
        in >> n >> m >> p;
        citire(n, m);
        for(int i = 1; i <= n; i++){
            d[i] = INF;
        }
        q.push(edge{p, 0});
        while(!q.empty()){
            edge t = q.top();
            q.pop();
            if(d[t.dest] == INF){
                d[t.dest] = t.dist;
                for(auto it: g[t.dest]){
                    q.push(edge{it.dest, it.dist + t.dist});
                }
            }
        }
        if(comparare()){
            out << "DA" << "\n";
        }
        else{
            out << "NU" << "\n";
        }
        a++;
    }

    return 0;
}