Cod sursa(job #2654702)

Utilizator denmirceaBrasoveanu Mircea denmircea Data 1 octombrie 2020 23:22:31
Problema Distante Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.64 kb
/// BMDesktop
#include <iostream>
#include <fstream>
#include <algorithm>
#include <bitset>
#include <vector>
#include <deque>
#include <set>
#define dim 7505
#define inf 2000000000
using namespace std;

string nameProb="distante";
ifstream fin(nameProb+".in");
ofstream fout(nameProb+".out");
vector < pair<int,int> > L[dim];
int d[dim],n,m,srs,x,y,c,off[dim];
void dijkstra(int nod)
{
    d[nod]=0;
    set< pair<int,int> > s;
    s.insert({d[nod],nod});
    while(s.size())
    {
        auto aux=s.begin();
        s.erase(s.begin());
        nod=aux->second;
        for(auto it:L[nod])
        {
            if( d[it.first] > d[nod]+it.second)
            {
                s.erase({d[it.first],it.first});
                d[it.first]=d[nod]+it.second;
                s.insert({d[it.first],it.first});
            }
        }
    }
}
void golire(int n)
{
    for(int i=1; i<=n; i++)
        d[i]=inf;
    for(int i=1; i<=n; i++)
        L[i].clear();
}
int main()
{
    int t;
    fin>>t;
    for(int test=1; test<=t; test++)
    {
        fin>>n>>m>>srs;
        golire(n);

        for(int i=1; i<=n; i++)
            fin>>off[i]; /// dist oficiala
        for(int i=1; i<=m; i++)
        {
            fin>>x>>y>>c;
            L[y].push_back({x,c});
            L[x].push_back({y,c});
        }
        dijkstra(srs);
        int ok=0;
        for(int i=1; i<=n; i++)
        {
            if(off[i]!=d[i])
            {
                ok=1;
                break;
            }
        }
        if(ok==0)
            fout<<"DA\n";
        else
            fout<<"NU\n";

    }


}