Cod sursa(job #2654408)

Utilizator KPP17Popescu Paul KPP17 Data 30 septembrie 2020 20:21:27
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda traininggraph Marime 1.76 kb

#define fisier "distante"
#include <fstream>
std::ifstream in(fisier ".in");
std::ofstream out(fisier ".out");


const int N = 50000, M = 2*N, C = 1000, INF = M*C + 1;
#include <vector>
#include <utility>
using pair = std::pair<int, int>;
std::vector<pair> vecini[N];
int n, rad, dist[N];

#include <queue>
bool corect()
{
    int distCorecta[N];
    bool explorat[N] = {};
    for (int i = 0; i < n; i++)
        distCorecta[i] = INF;
    distCorecta[rad] = 0;
    std::priority_queue<pair, std::vector<pair>, std::greater<pair>> pq;
    pq.push({0, rad});
    while (pq.size())
    {
        pair arc = pq.top();
        pq.pop();
        explorat[arc.second] = true;
        for (pair vecin: vecini[arc.second])
            if (!explorat[vecin.second])
            {
                int nouaDist = distCorecta[arc.second] + vecin.first;
                if (nouaDist < distCorecta[vecin.second])
                {
                    distCorecta[vecin.second] = nouaDist;
                    pq.push({nouaDist, vecin.second});
                }
            }
    }
    for (int i = 0; i < n; i++)
        if (dist[i] != distCorecta[i])
            return false;
    return true;
}

int main()
{
    int grafuri;
    in >> grafuri;
    while (grafuri--)
    {
        int m;
        in >> n >> m >> rad; rad--;
        for (int i = 0; i < n; i++)
            in >> dist[i];
        while (m--)
        {
            int a, b, cost;
            in >> a >> b >> cost;
            vecini[--a].push_back({cost, --b});
            vecini[b].push_back({cost, a});
        }
        out << (corect()? "DA": "NU") << '\n';
        for (int i = 0; i < n; i++)
            vecini[i].clear();
    }

}