Cod sursa(job #2126955)

Utilizator patcasrarespatcas rares danut patcasrares Data 10 februarie 2018 10:45:06
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include<fstream>
#include<vector>
#include<queue>
#define pb push_back
#define x first
#define y second
#define DN 50005
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
int t,n,m,s,d[DN],dist[DN],p,f,g,nod,c;
vector<pair<int,int> >v[DN];
priority_queue<pair<int,int> >q;
void ve()
{
    while(!q.empty())
    {
        c=-q.top().x;
        nod=q.top().y;
        q.pop();
        if(c!=dist[nod])
            continue;
        for(auto i:v[nod])
            if(dist[nod]+i.y<dist[i.x])
            {
                dist[i.x]=dist[nod]+i.y;
                q.push({-dist[i.x],i.x});
            }
    }
}
int main()
{
    fin>>t;
    for(int h=1;h<=t;h++)
    {
        fin>>n>>m>>s;
        for(int i=1;i<=n;i++)
        {
            v[i].clear();
            fin>>d[i];
            dist[i]=1e9;
        }
        dist[s]=0;
        for(int i=1;i<=m;i++)
        {
            fin>>f>>g>>c;
            v[f].pb({g,c});
            v[g].pb({f,c});
        }
        q.push({0,s});
        ve();
        p=1;
        for(int i=1;i<=n;i++)
            if(d[i]!=dist[i])
            {
                p=0;
                break;
            }
        if(p)
            fout<<"DA";
        else
            fout<<"NU";
        fout<<'\n';
    }
}