Cod sursa(job #2682767)

Utilizator AndreibatmanAndrei Croitoriu Andreibatman Data 9 decembrie 2020 16:20:41
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
struct ceva
{
    int nod;
    long long cost;
    bool operator < (const ceva &x)const
    {
        return cost>x.cost;
    }
} gr,u;
priority_queue<ceva>q;
vector<ceva>v[50010];
int n,m,i,j,viz[50010],d[50010],a,b,c,t,dd[50010],s;
int main()
{
    fin>>t;
    while(t--)
    {
        fin>>n>>m>>s;
        for(i=1; i<=n; i++)
        {
            fin>>dd[i];
            d[i]=INT_MAX,v[i].clear();
            viz[i]=false;
        }
        for(i=1; i<=m; i++)
        {
            fin>>a>>b>>c;
            gr.nod=b;
            gr.cost=c;
            v[a].push_back(gr);
        }
        d[s]=0;
        gr.nod=s;
        gr.cost=0;
        q.push(gr);
        while(!q.empty())
        {
            gr=q.top();
            if(!viz[gr.nod])
            {
                viz[gr.nod]=1;
                for(auto it=v[gr.nod].begin(); it!=v[gr.nod].end(); ++it)
                {
                    ceva v=*it;
                    if(d[v.nod]>gr.cost+v.cost)
                    {
                        d[v.nod]=gr.cost+v.cost;
                        u.nod=v.nod;
                        u.cost=d[v.nod];
                        q.push(u);
                    }
                }
            }
            q.pop();
        }
        int ok=1;
        for(i=1; i<=n && ok; i++)
            if(d[i]!=dd[i])
                ok=0;
        if(ok==0)
            fout<<"NU"<<'\n';
        else fout<<"DA"<<'\n';
    }
    return 0;
}