Cod sursa(job #2570541)

Utilizator Alex2421Nedelcu Alexandru Alex2421 Data 4 martie 2020 17:28:13
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <bits/stdc++.h>

#define pb push_back
#define pp pop_back
#define mp make_pair

using namespace std;

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

int const lim =50001;
int const oo = 1e9;
int t,n,m,v[lim],d[lim],st;
bool ver[lim];
vector < pair < int , int > > c[lim];

struct comp
{
    bool operator()(int a , int b)
    {
        return d[a]>d[b];
    }
};

priority_queue < int , vector < int > , comp > q;

void dijk(int nod)
{
    for(int i=1;i<=n;i++)
        d[i]=oo;

    d[nod]=0;
    ver[nod]=1;
    q.push(nod);

    while( !q.empty() )
    {
        int x=q.top();
        q.pop();
        ver[x]=0;
        for(int i=0;i<c[x].size();i++)
        {
            int vecin= c[x][i].first;
            int cost = c[x][i].second;
            if(d[vecin] > d[x] + cost )
            {
                d[vecin]=d[x]+cost;
                if(ver[vecin]==0)
                {
                    q.push(vecin);
                    ver[vecin]=1;
                }
            }
        }
    }
}

int main()
{
   in>>t;
   for(int i=1;i<=t;i++)
   {
       in>>n>>m>>st;
       for(int j=1;j<=n;j++)
        in>>v[j];

       for(int j=1;j<=m;j++)
       {
           int x,y,z;
           in>>x>>y>>z;
           c[x].pb(mp(y,z));
           c[y].pb(mp(x,z));
       }

       dijk(st);
       bool vr=0;
       for(int j=1;j<=n;j++)
       if(v[j]!=d[j]) {vr=1; break;}

       if(vr==0) out<<"DA";
       else out<<"NU";
       out<<'\n';

       for(int j=1;j<=n;j++)
        while( !c[j].empty() )
        c[j].pp();
   }
}