Cod sursa(job #3227014)

Utilizator ANNOnymousMihaila Stefan-Alexandru ANNOnymous Data 24 aprilie 2024 09:50:47
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <bits/stdc++.h>
#define Nmax 101
#define INF 1<<30

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

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

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

void Dijkstra(int start)
{
    priority_queue<int, vector<int>, comp> Q;

    dist[start]=0;
    Q.push(start);

    while(!Q.empty())
    {
        int nod=Q.top();
        Q.pop();
        for(auto& i:G[nod])
        {
            int vecin=i.first;
            int cost=i.second;
            if(dist[nod]+cost<dist[vecin])
            {
                dist[vecin]=dist[nod]+cost;
                Q.push(vecin);
            }
        }
    }
}
int main() {

    fin >> t;
    for (int k = 1; k <= t; k ++) {
        fin >> n >> m >> s;
        for (int i = 1; i <= n; i ++)
            fin >> dist_prob[i];
        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;
        Dijkstra(s);
        int ok = 1;
        for (int i = 1; i <= n; i ++)
            if (dist[i] != dist_prob[i]) {
                fout << "NU" << '\n';
                ok = 0;
                break;
            }
        if (ok)
            fout << "DA" << '\n';
    }
}