Cod sursa(job #2822137)

Utilizator OrzataAndreiOrzata Andrei OrzataAndrei Data 23 decembrie 2021 16:46:19
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <bits/stdc++.h>

using namespace std;

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

const int INF=0x3f3f3f3f;
const int MAXN=50001;

int T,N,M,S,x,y,c,i,j,k;
int visited[MAXN],d[MAXN],dist[MAXN];
vector<pair<int, int>> G[MAXN];

int main()
{
    in>>T;
    for(k=1; k<=T; ++k)
    {
        in>>N>>M>>S;
        for(i=1; i<=N; i++)
            in>>d[i];
        for(i=1; i<=N; i++)
            while(G[i].size())
                G[i].pop_back();

        for(i=1; i<=M; i++)
        {
            int x,y,c;
            in>>x>>y>>c;
            G[x].push_back(make_pair(y,c));
        }
        memset(dist,INF,sizeof(dist));
        memset(visited,0,sizeof(visited));

        queue<int> Q;

        Q.push(S);
        dist[S]=0;
        visited[S]=1;
        while(!Q.empty())
        {
            x=Q.front();
            Q.pop();

            visited[x]=0;
            for(auto elem : G[x])
            {
                int node = elem.first;
                int cost = elem.second;

                if(dist[x] + cost < dist[node])
                {
                    dist[node]=dist[x]+cost;
                    if(visited[node]==0)
                        Q.push(node);
                    visited[node]=1;

                }
            }
        }
        x=1;
        for(i=1; i<=N&&x; ++i)
            if(d[i]!=dist[i])
                x=0;
        if(x)
            out<<"DA\n";
        else
            out<<"NU\n";


    }

    return 0;


}