Cod sursa(job #2505208)

Utilizator lucianul31Moisii Lucian lucianul31 Data 6 decembrie 2019 15:23:35
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <iostream>
#include<bits/stdc++.h>

using namespace std;

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

#define loop(n) for(int i=1; i<=n; i++)
#define loop(m) for(int j=1; j<=m; j++)

const int NMAX=5e4 + 10;
int T, n, m, S, DB[NMAX], D[NMAX];
vector < pair < int, int > > Edge[NMAX];
bitset < NMAX > Seen;

void initialize()
{
    for(int i=1; i<=n; i++)
        D[i]=10000000;
}

inline bool Dijkstra(int nod)
{
    priority_queue < pair < int, int > > Q;
    Q.push({0, S});
    D[S]=0;
    int x;
    while(!Q.empty())
    {
        x=Q.top().second;
        Q.pop();
        if(!Seen[x])
        {
            for(auto it : Edge[x])
                if(D[x]+it.second<D[it.first])
                    D[it.first]=D[x]+it.second, Q.push({-D[it.first], it.first});
            Seen[x]=1;
        }
    }
    for(int i=1; i<=n; i++)
       if(DB[i]!=D[i])
            return 0;
    return 1;
}

void Read_Solve()
{
    in>>T;
    int x, y, c;
    for(int k=1; k<=T; k++)
    {
        in>>n>>m>>S;
        for(int i=1; i<=n; i++)
            in>>DB[i];
        loop(m)
        in>>x>>y>>c, Edge[x].push_back({y, c}), Edge[y].push_back({x, c});
        initialize();
        if(Dijkstra(S))

            out<<"DA\n";
        else
            out<<"NU\n";
    }
}

int main()
{
    Read_Solve();
    return 0;
}