Cod sursa(job #2062105)

Utilizator alexandra_paticaAndreea Alexandra Patica alexandra_patica Data 9 noiembrie 2017 23:32:13
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <cstdio>
#include <vector>
#include <queue>
# define maxn 50100
using namespace std;

vector<int>G[maxn], C[maxn];
queue<int>q;
int n, m, s, i, j, x, y, c, t, l, ok, dist[maxn], d[maxn], inf=999999999;


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

    scanf("%d", &t);
    for (l=1; l<=t; l++){
        for (i=1; i<=n; i++){
            G[i].clear(); C[i].clear();
        }
        scanf("%d%d%d", &n, &m, &s);
        for (i=1; i<=n; i++) scanf("%d", &dist[i]);
        for (i=1; i<=n; i++) if (i!=s) d[i]=inf;
        for (i=1; i<=m; i++){
            scanf("%d%d%d", &x, &y, &c);
            G[x].push_back(y);
            G[y].push_back(x);
            C[x].push_back(c);
            C[y].push_back(c);
        }

        q.push(s);
        d[s]=0;
        while (!q.empty()){
            x=q.front();
            for (i=0; i<G[x].size();i++){
                if (d[G[x][i]]>d[x]+C[x][i]){
                    d[G[x][i]]=d[x]+C[x][i];
                    q.push(G[x][i]);
                }
            }
            q.pop();
        }
        ok=1;
        for (i=1; i<=n; i++){
            if (d[i]!=dist[i]){
                ok=0; break;
            }
        }
        if (ok) printf("DA\n");
        else printf("NU\n");
//        printf("\n");
    }
    return 0;
}