Cod sursa(job #2819374)

Utilizator VladMxPMihaila Vlad VladMxP Data 18 decembrie 2021 11:49:28
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <bits/stdc++.h>
#define inf 2e9
#define NMAX 50001

using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
int n,m,sol[NMAX],d[NMAX];
bool vis[NMAX];
vector<pair<int,int> > v[NMAX];
priority_queue<pair<int,int>, vector<pair<int,int> >, greater<pair<int,int> > > h; // min-heap

int main()
{
    int i,t,start,x,y,cost,node,next;
    fin>>t;
    for(;t;t--)
    {
        fin>>n>>m>>start;
        for(i=1;i<=n;i++)
            fin>>sol[i];

        for(i=1;i<=m;i++)
        {
            fin>>x>>y>>cost;
            v[x].push_back({cost,y});
            v[y].push_back({cost,x});
        }

        for(i=1;i<=n;i++)
            d[i]=inf;
        d[start]=0;
        h.push({0,start});

        while(!h.empty())
        {
            node=h.top().second;
            h.pop();
            if(!vis[node])
            {
                for(i=0;i<v[node].size();i++)
                {
                    cost=v[node][i].first;
                    next=v[node][i].second;
                    if(d[node]+cost<d[next])
                    {
                        d[next]=d[node]+cost;
                        h.push({d[next],next});
                    }
                }
            }
            vis[node]=1;
        }
        bool ok=1;
        for(i=1;i<=n;i++)
        {
            if(sol[i]!=d[i])
                ok=0;
            d[i]=inf;
            v[i].clear();
        }
        if(ok)fout<<"DA\n";
        else fout<<"NU\n";

        memset(vis,0,sizeof(vis));
    }
}