Cod sursa(job #2087643)

Utilizator BovisioNitica Ionut Bogdan Bovisio Data 13 decembrie 2017 21:48:21
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <cstdio>
#include <vector>
#include <queue>

#define INF 99999999

using namespace std;

int T,n,m,DC[50003],D[12][50003],start;

vector < pair < int , int > > L[12][50002];
priority_queue < pair < int , int > > Heap;

bool Dijkstra(int Nstart,int k)
{
    bool Da=true;
    int node,cost,neigh,son,sum;
    for(int i=1;i<=n;i++)
        D[k][i] = INF;
    D[k][Nstart] = 0;
    Heap.push({0,Nstart});
    while(!Heap.empty())
    {
        cost = -Heap.top().first;
        node = Heap.top().second;
        Heap.pop();
        if(cost <= D[k][node])
        {
            neigh = L[k][node].size();
            for(int i=0;i<neigh;i++)
            {
                son = L[k][node][i].first;
                sum = L[k][node][i].second;
                if(D[k][son] > sum + cost)
                {
                    D[k][son] = sum + cost;
                    Heap.push({-D[k][son],son});
                }
            }
        }
    }
    for(int i=1;i<=n;i++)
    {
        if(DC[i] != D[k][i])
        {
            return false;
        }
    }
    return true;
}

void Read()
{
    int a,b,c;
    freopen("distante.in","r",stdin);
    freopen("distante.out","w",stdout);
    scanf("%i",&T);
    for(int k=1;k<=T;k++)
    {
        scanf("%i %i %i",&n,&m,&start);
        for(int i=1;i<=n;i++)
            scanf("%i",&DC[i]);
        for(int i=1;i<=m;i++)
        {
            scanf("%i %i %i",&a,&b,&c);
            L[k][a].push_back({b,c});
            L[k][b].push_back({a,c});
        }
        if(Dijkstra(start,k) == true)
            printf("DA\n");
        else
            printf("NU\n");
    }

}

int main()
{
    Read();
    return 0;
}