Cod sursa(job #2639193)

Utilizator loraclorac lorac lorac Data 31 iulie 2020 21:00:01
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("distante.in");
ofstream out("distante.out");
const int lim=5e4+3;
const int inf=2e9+7;
vector<pair<int,int> > vec[lim];
set<pair<int,int> > s;
int dist[lim],ast[lim];
int n,m,src,tst,a,b,c;
void dijkstra()
{
    for(int i=1;i<=n;++i)
        dist[i]=inf;
    dist[src]=0;
    s.clear();
    s.insert({0,src});
    while(!s.empty())
    {
        int d=(*(s.begin())).first;
        int x=(*(s.begin())).second;
        s.erase(s.begin());
        if(ast[x]!=d) {out<<"NU\n";return ;}
        for(pair<int,int> y:vec[x])
        if(dist[y.first]>d+y.second)
        {
            if(dist[y.first]!=inf)
                s.erase(s.find({dist[y.first],y.first}));
            dist[y.first]=d+y.second;
            if(dist[y.first]<ast[y.first]) {out<<"NU\n";return ;}
            s.insert({dist[y.first],y.first});
        }
    }
    out<<"DA\n";
}
int main()
{
    in>>tst;
    while(tst--)
    {
        in>>n>>m>>src;
        for(int i=1;i<=n;++i)
            vec[i].clear();
        for(int i=1;i<=n;++i)
            in>>ast[i];
        for(int i=1;i<=m;++i)
        {
            in>>a>>b>>c;
            vec[a].push_back({b,c});
            vec[b].push_back({a,c});
        }
        dijkstra();
    }
    return 0;
}