Cod sursa(job #2819366)

Utilizator VladMxPMihaila Vlad VladMxP Data 18 decembrie 2021 11:44:14
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.53 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});
        }

        memset(vis,0,sizeof(vis));
        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&&ok;i++)
        {
            if(sol[i]!=d[i])
            {
                fout<<"NU\n";
                ok=0;
            }
        }
        if(ok)fout<<"DA\n";
    }
}