Cod sursa(job #2343021)

Utilizator nick12nicolae mihalache nick12 Data 13 februarie 2019 17:00:21
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <bits/stdc++.h>
using namespace std;



#define pp pair<int,int>
#define oo 100000000
#define RRR ios_base::sync_with_stdio(false);cin.tie(0);
#define ll long long
#define int ll
int verif[50001];
int dist[50001];
int ar[5001][5001];
int n,m,s;
void calculate(int s)
{
    for (int i=0;i<=n;i++)
        dist[i] = oo;
    priority_queue < pair< int,int>  > S;
    S.push(make_pair(0,s));
    dist[s] = 0;
    while (!S.empty())
    {

        int u = S.top().second;
        S.pop();
        for (int i=1;i<=n;i++)
        {
            if (ar[u][i] != 0)
            {
                if (dist[i] > dist[u] + ar[u][i])
                {
                    dist[i] = dist[u] +ar[u][i];
                    S.push(make_pair(dist[u],i));
                }
            }
        }
    }
}


int32_t main()
{RRR
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);


    int t;
    cin >> t;
    while (t--)
    {

        cin >> n >> m >> s;
        for (int i=0;i<n;i++) cin >> verif[i];
        for (int i=0;i<m;i++)
        {
            int a,b,c;
            cin >> a >> b >>c;
            ar[a][b] = ar[b][a] = c;

        }
        calculate(s);
        bool k = false;
        for (int i=0;i<n;i++)
            if (verif[i] != dist[i+1]) k = true;
        if (!k) cout << "DA\n"; else cout << "NU\n";
    }
    return 0;
}