Cod sursa(job #2274207)

Utilizator SchnitzelMannPavaloiu Gabriel SchnitzelMann Data 1 noiembrie 2018 15:45:38
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.39 kb
#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
ifstream in("distante.in");
ofstream out("distante.out");
vector<pair<int,int>> v[50002];
int a[50002],ar[50002];
priority_queue<pair<int,int>> h;
int main()
{
    int t,n,m,s,i,nr1,nr2,c,b;
    in>>t;
    while(t--)
    {
        in>>n>>m>>s;b=1;
        for(i=1;i<=n;i++)
        {
            in>>ar[i];
            a[i]=0;
            v[i].clear();
        }
        for(i=0;i<m;i++)
        {
            in>>nr1>>nr2>>c;
            v[nr1].push_back({c,nr2});
            v[nr2].push_back({c,nr1});
        }
        h.push({-1,s});
        while(!h.empty())
        {
            while(!h.empty()&&a[h.top().y]>0)
                h.pop();
            if(h.empty())break;
            nr1=h.top().y;nr2=-h.top().x;
            h.pop();
            a[nr1]=nr2;
            if(nr2-1!=ar[nr1])
            {
                b=0;
                while(!h.empty())
                    h.pop();
                break;
            }
            for(auto it:v[nr1])
                if(a[it.y]==0||(a[it.y]<0&&-a[it.y]>nr2+it.x))
                {
                    a[it.y]=-nr2-it.x;
                    h.push({-nr2-it.x,it.y});
                }
        }
        for(i=2;b&&i<=n;i++)
            if(max(a[i]-1,0)!=ar[i])
                b=0;
        if(b)
            out<<"DA\n";
        else
            out<<"NU\n";
    }
    return 0;
}