Cod sursa(job #1926832)

Utilizator andreigasparoviciAndrei Gasparovici andreigasparovici Data 14 martie 2017 18:33:29
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
#define MAXN 50005
#define INF 0x3f3f3f3f
using namespace std;

int T, N, M, S;
int D[MAXN], d[MAXN];
vector<pair<int,int> >graf[MAXN];

void init()
{
    fill(d,d+MAXN,INF);
    for(int i=1;i<MAXN;i++)
    {
        graf[i].clear();
    }
}

void citire()
{
    scanf("%d %d %d",&N,&M,&S);
    for(int i=1;i<=N;i++)
    {
        scanf("%d ",&D[i]);
    }

    for(int i=1;i<=M;i++)
    {
        int a, b, c;
        scanf("%d %d %d",&a,&b,&c);
        graf[a].push_back(make_pair(b,c));
        graf[b].push_back(make_pair(a,c));
    }
}

void dijkstra()
{
    d[S] = 0;
    queue<int>coada;
    coada.push(S);

    while(!coada.empty())
    {
        int nod = coada.front();
        coada.pop();
        for(auto &it : graf[nod])
        {
            if(d[it.first] > d[nod] + it.second)
            {
                d[it.first] = d[nod] + it.second;
                coada.push(it.first);
            }
        }
    }
}

void compara()
{
    bool ok = true;
    for(int i=1;i<=N && ok;i++)
    {
        if(D[i]!=d[i])
            ok = false;
    }
    if(ok)
        printf("DA\n");
    else printf("NU\n");
}

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

    scanf("%d",&T);

    for(int t=0;t<T;t++)
    {
        init();
        citire();
        dijkstra();
        compara();
    }

    return 0;
}