Cod sursa(job #2062756)

Utilizator andreiutu111Noroc Andrei Mihail andreiutu111 Data 10 noiembrie 2017 20:01:13
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
int T,N,M,S,x,y,c,d[50001],e[50001];
queue <int> coada;
vector <int> G[50001],C[50001];
int main()
{
    freopen("distante.in","r",stdin);
    freopen("distante.out","w",stdout);
    scanf("%d",&T);
    for(int o=1;o<=T;++o){
        scanf("%d%d%d",&N,&M,&S);
        for(int i=1;i<=N;++i){
            scanf("%d",&e[i]);
            if(i!=S)d[i]=0x3f3f3f3f;
            else d[i]=0;
        }
        while(M--){
            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);
        }
        coada.push(S);
        while(!coada.empty()){
            x=coada.front();
            coada.pop();
            for(int 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];
                    coada.push(G[x][i]);
                }
        }
        bool ok=1;
        for(int i=1;i<=N&&ok;++i)
            if(d[i]!=e[i])
                ok=0;
        if(ok)printf("DA\n");
        else printf("NU\n");
    }
    return 0;
}