Cod sursa(job #2835651)

Utilizator cdenisCovei Denis cdenis Data 19 ianuarie 2022 01:21:48
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

ifstream fin("distante.in");
ofstream fout("distante.out");

const int MAX=50005;
const int INF=1e9;
int n,m,s,t,a,b,c,zaharel[MAX],viz[MAX],bronzarel[MAX];
typedef pair < int, int > ip;
vector < ip > v[MAX];
priority_queue < ip, vector < ip >, greater < ip > > pq;

int main()
{
    fin >> t;
    while(t--)
    {
        fin >> n >> m >> s;
        for(int i=1;i<=n;i++)
        {
            fin >> bronzarel[i];
            zaharel[i]=INF;
            v[i].clear();
            viz[i]=0;
        }
        zaharel[s]=0;
        pq.push(make_pair(0,s));
        while(m--)
        {
            fin >> a >> b >> c;
            v[a].push_back(make_pair(b,c));
            v[b].push_back(make_pair(a,c));
        }
        while(!pq.empty())
        {
            int nod=pq.top().second;
            pq.pop();
            if(!viz[nod])
            {
                viz[nod]=1;
                for(auto ngh : v[nod])
                {
                    int vec=ngh.first;
                    int dist=ngh.second;
                    if(zaharel[vec]>zaharel[nod]+dist)
                    {
                        zaharel[vec]=zaharel[nod]+dist;
                        pq.push(make_pair(zaharel[vec],vec));
                    }
                }
            }
        }
        bool ok=1;
        for(int i=1;i<=n && ok;i++)
            if(zaharel[i]!=bronzarel[i])
                ok=0;
        fout << (ok?"DA\n":"NU\n");
    }
	return 0;
}