Cod sursa(job #2543836)

Utilizator TeddyDinutaDinuta Eduard Stefan TeddyDinuta Data 11 februarie 2020 16:22:49
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("distante.in");
ofstream out("distante.out");
int t,n,m,s,x,y,d[50005],d1[50005],ok[50005],k,c;
vector<pair<int,int>> v[50005];
priority_queue< pair<int,int> ,vector<pair<int,int>> ,greater<pair<int,int>>> q;
pair<int,int> z;
void dijkstra(int nod)
{
    d1[nod]=0;
    q.push({0,nod});
    while(!q.empty())
    {
        z=q.top();
        q.pop();
        if(ok[z.second]==1) continue;
        ok[z.second]=1;
        for(auto it:v[z.second])
        {
            if(ok[it.second]==0&&d1[it.second]>d1[z.second]+it.first)
            {
                d1[it.second]=d1[z.second]+it.first;
                q.push({d1[it.second],it.second});
            }
        }
    }
}
int main()
{
    in>>t;
    while(t--)
    {
        in>>n>>m>>s;
        for(int i=1;i<=n;i++) {
            in>>d[i];
            d1[i]=1e9;
            ok[i]=0;
            v[i].clear();
        }
        k=1;
        for(int i=1;i<=m;i++)
        {
            in>>x>>y>>c;
            v[x].push_back({c,y});
            v[y].push_back({c,x});
        }
        while(!q.empty()) q.pop();
        dijkstra(s);
        for(int i=1;i<=n;i++) {
            if(d1[i]!=d[i]) k=0;
        }
        if(k) out<<"DA"<<'\n';
        else out<<"NU"<<'\n';
    }
    return 0;
}