Cod sursa(job #2671728)

Utilizator LeCapataIustinian Serban LeCapata Data 12 noiembrie 2020 17:05:24
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <fstream>
#include <vector>
#include <queue>
#define N 50005
#define INF 1000000000
using namespace std;

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

int t, n, m, s;
bool vizitat[N];
int dist[N], actualDist[N];

struct comp{
    bool operator()(int x, int y){
        return dist[x] > dist[y];
    }
};

priority_queue<int, vector<int>, comp> coada;
vector< vector< pair<int, int> > > graf(N);

void dijkstra(int nodStart){
    for(int i = 1; i <= n; ++i)
        dist[i] = INF;

    coada.push(nodStart);
    vizitat[nodStart] = 1;
    dist[nodStart] = 0;

    while(!coada.empty()){
        int nodCurent = coada.top();
        coada.pop();

        for(unsigned int i = 0; i < graf[nodCurent].size(); ++i){
            int nodVecin = graf[nodCurent][i].first;
            int cost = graf[nodCurent][i].second;

            if(dist[nodCurent] + cost < dist[nodVecin]){
                dist[nodVecin] = dist[nodCurent] + cost;
                if(vizitat[nodVecin] == 0) vizitat[nodVecin] = 1, coada.push(nodVecin);
            }
        }
    }
}

int main()
{
    in>>t;
    while(t--){
        in>>n>>m>>s;
        for(int i = 1; i <= n; ++i)
            in>>actualDist[i];
        for(int i = 1; i <= m; ++i){
            int x, y, c;
            in>>x>>y>>c;
            graf[x].push_back(make_pair(y, c));
            graf[y].push_back(make_pair(x, c));
        }
        dijkstra(s);

        bool sem = 0;
        for(int i = 1; i <= n; ++i)
            if(actualDist[i] != dist[i]){
                sem = 1;
                break;
            }
        if(sem) out<<"NU\n";
        else out<<"DA\n";
    }
    in.close();
    out.close();
    return 0;
}