Cod sursa(job #3158249)

Utilizator X2RaresRares Ionascu X2Rares Data 18 octombrie 2023 09:43:46
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <fstream>
#include <set>
#define INF 2e9

using namespace std;

ifstream f("distante.in");
ofstream g("distante.out");

int n,m,s, a[50001],d[50001];

set<pair<int,int>> v[5001];
set<pair<int,int>> Q;

void init(int n)
{
    int i;
    for(i=1;i<=n;i++){d[i] = INF;}
}

void dijkstra(int nod)
{
    Q.insert(make_pair(0, nod));
    while(!Q.empty())
    {
        nod = Q.begin()->second;
        Q.erase(Q.begin());
        for(set<pair<int,int>>::iterator it=v[nod].begin(); it!=v[nod].end(); it++)
        {
            int nod_next = it->first;
            int cost_next = it->second;
            if(d[nod] + cost_next < d[nod_next])
            {
             Q.erase(make_pair(d[nod_next], nod_next));
             d[nod_next] = d[nod] +  cost_next;
             Q.insert(make_pair(d[nod_next], nod_next));
            }
        }
    }
}

int main()
{
    int t,i,x,y,c;
    f>>t;
    for(int h = 1; h <= t; h++)
    {
     f>>n>>m>>s;
     for(i=1;i<=n;i++)f>>a[i];
     for(i = 1; i <= m; i++){
        f>>x>>y>>c;
        v[x].insert(make_pair(y, c));
        v[y].insert(make_pair(x, c));
     }
     init(n);
     d[s]=0;
     dijkstra(s);
     int ok=1;
     for(i=1;i<=n;i++){
        if(a[i]!=d[i]){ok=0;}
     }
     if(ok==1){g<<"DA";}
     else{g<<"NU";}
     g<<'\n';
    }
    return 0;
}