Cod sursa(job #2962118)

Utilizator Catalinu23Gavrila Catalin Catalinu23 Data 7 ianuarie 2023 19:39:06
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <bits/stdc++.h>
#define oo 2000000000
#define NMAX 1000005
using namespace std;

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

struct muchie
{
    int nod, cost;
    bool operator < (const muchie A) const
    {
        return A.cost < cost;
    }
};



priority_queue<muchie> q;
vector<muchie> L[NMAX];

int t, n, m;

int dist[NMAX], d[NMAX];
bool viz[NMAX];

void dijkstra(int start)
{
    for(int i=1; i<=n; i++)
        dist[i] = oo, viz[i] = 0;
    dist[start] = 0;
    muchie aux;
    aux.nod = start;
    aux.cost = 0;
    q.push(aux);
    while(!q.empty())
    {
        aux = q.top();
        q.pop();
        int nod = aux.nod;
        if(!viz[nod])
        {
            viz[nod] = 1;
            for(auto it: L[nod])
            {
                if(dist[nod] + it.cost < dist[it.nod])
                {
                    dist[it.nod] = dist[nod] + it.cost;
                    aux.nod = it.nod;
                    aux.cost = dist[it.nod];
                    q.push(aux);
                }
            }
        }

    }
}

int main()
{
    fin>>t;
    while(t--)
    {
        int start;
        fin>>n>>m>>start;
        for(int i=1; i<=n; i++)
            fin>>d[i];
        for(int i=1; i<=m; i++)
        {
            int x, y, cost;
            muchie aux;
            fin>>x>>y>>cost;
            aux.nod = y;
            aux.cost = cost;
            L[x].push_back(aux);
            aux.nod = x;
            L[y].push_back(aux);
        }
        dijkstra(start);
        bool ok = 1;
        for(int i=1; i<=n; i++)
        {
            //cout<<i<<" "<<d[i]<<" "<<dist[i]<<"\n";
            if(dist[i] != d[i])
            {
                ok = 0;
                break;
            }
        }
        for(int i=1; i<=n; i++)
            L[i].clear();
        if(ok)
            fout<<"DA\n";
        else
            fout<<"NU\n";
    }
    return 0;
}