Cod sursa(job #2358136)

Utilizator aturcsaTurcsa Alexandru aturcsa Data 27 februarie 2019 21:37:00
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <iostream>
#include <vector>
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
vector < pair<int,int> > A[100001];
int n,m,T,s;
priority_queue <pair <int,int> >Q;
int dist[100001],D[100001];
int viz[100001];
int DZ[100001];
int main()
{
    fin>>T;
    for(int t=1; t<=T; t++)
    {
        fin>>n>>m>>s;
        for(int i=1;i<=n;i++)
            {
                fin>>DZ[i];
                dist[i]=-1000000000;
                viz[i]=0;
            }
            dist[s]=0;
        for(int i=1; i<=m; i++)
        {
            int a,b,c;
            fin>>a>>b>>c;
            A[a].push_back({-1*c,b});
            A[b].push_back({-1*c,a});
        }
        Q.push({0,s});
        while(!Q.empty())
        {
            int nod,cnod;
            nod=Q.top().second;
            cnod=Q.top().first;
            Q.pop();
            if(!viz[nod])
            {
                for(auto it:A[nod])
                {
                    int nnod,cnnod;
                    cnnod=it.first;
                    nnod=it.second;

                    if(dist[nod]+cnnod>dist[nnod])
                    {
                        dist[nnod]=dist[nod]+cnnod;
                        Q.push({dist[nnod],nnod});
                    }

                }
                viz[nod]=1;
            }
        }
        int ok=1;
        for(int i=1; i<=n; i++)
        {
            if(dist[i]!=-1000000000)
                if(-1*dist[i]!=DZ[i])
                {
                    ok=0;
                    break;
                }

        }
        if(ok==1)
            fout<<"DA\n";
        else
            fout<<"NU\n";

    }
    return 0;
}