Cod sursa(job #2841416)

Utilizator xXoctavianXxStanescu Matei Octavian xXoctavianXx Data 29 ianuarie 2022 18:04:38
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <bits/stdc++.h>

using namespace std;

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

const int nmax=5e4+4;
int n,m,s,rasp=1,t;
int d[nmax],dist_in[nmax];
vector<pair<int,int> > vecini[nmax];
bool vizitat[nmax];

void reseteaza()
{
    for(int i=1; i<=n; i++)
    {
        vecini[i].clear();
        d[i]=0;
        vizitat[i]=0;
    }
    rasp=1;
}

void dijkstra()
{
    priority_queue<pair<int,int> > q;
    q.push({0,s});
    while(!q.empty())
    {
        int i=q.top().second;
        q.pop();
        if(!vizitat[i])
        {
            vizitat[i]=1;
            for(auto per: vecini[i])
            {
                int pi=per.first;
                int cost=per.second;
                if(d[pi]>d[i] + cost || d[pi]==-1)
                {
                    d[pi]=d[i] + cost;
                    q.push({-d[pi],pi});
                }
            }
        }
    }
}

int main()
{
    fin>>t;
    while(t--)
    {
        fin>>n>>m>>s;
        for(int i=1; i<=n; i++)
        {
            fin>>dist_in[i];
            d[i]=-1;
        }
        d[s]=0;
        for(int i=1; i<=m; i++)
        {
            int a,b,c;
            fin>>a>>b>>c;
            vecini[a].push_back({b,c});
            vecini[b].push_back({a,c});
        }
        dijkstra();
        for(int i=1; i<=n; i++)
        {
            //cout<<d[i]<<" ";
            if(dist_in[i]!=d[i]) rasp=0;
        }
        //cout<<"\n";
        string OUT= rasp ? "DA" : "NU";
        fout<<OUT<<"\n";
        reseteaza();
    }
    return 0;
}