Cod sursa(job #3192292)

Utilizator Didi6Cioana Diana Didi6 Data 12 ianuarie 2024 08:19:10
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.98 kb
//https://www.infoarena.ro/problema/distante

#include <fstream>
#include <vector>
#include <queue>
#include <iostream>
#include <limits.h>
using namespace std;
///distante
/**
t- nr grafu
n noduri
m muchii
s nod sursa
dn++ cost calc de future coleg de camera la nebuni
dm++ nod nod cost
d[] dement calc
*/
#define pb push_back
#define cin in
#define cout out
int cost[50001],n,m,s,t;
bool masca[50001];

struct compara
{
    bool operator()(int x, int y)
    {
        return cost[x] > cost[y];
    }
};

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

int krusadi(int x, vector < pair<int,int> >v[],priority_queue<int, vector<int>, compara> q)
{
    cost[x] = 0;
    q.push(x);
    int nod;
    while (!q.empty())
    {
        nod=q.top();
        q.pop();
        masca[nod]=false;

        for (int i=0;i<v[nod].size();i++)
        {
            int colegu=v[nod][i].first;
            int chirie=v[nod][i].second;

            if (cost[colegu] > cost[nod]+chirie)
            {
                cost[colegu] = cost[nod] + chirie;
                if (masca[colegu]==false)
                {
                    q.push(colegu);
                    masca[colegu]=true;
                }

            }
        }
    }
}

bool cit()
{
    priority_queue<int, vector<int>, compara> q;
    int a,b,ca,d[50001];
    cin >> n>> m >> s;
    vector < pair<int,int> >v[n + 1];

    for (int i=1;i<=n;i++){
        cin>>d[i];
        cost[i] = INT_MAX;
    }

    for (int i=0;i<m;i++)
    {
        cin>> a >> b >> ca;
        v[a].pb(make_pair(b,ca));
        v[b].pb(make_pair(a,ca));
    }
    krusadi(s,v,q);

    bool aw=true;
    for (int i=1;i<=n;i++)
        if (d[i]!=cost[i])
            aw=false;
    return aw;
}

int main()
{
    cin>>t;
    for (int e=0; e<t; t--)
    {
        if(cit()){
            cout << "DA" <<'\n';
        }else{
            cout << "NU" <<'\n';
        }
    }
    return 0;
}