Cod sursa(job #1735737)

Utilizator Burbon13Burbon13 Burbon13 Data 30 iulie 2016 19:59:09
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <cstdio>
#include <iostream>
#include <vector>
#include <queue>

using namespace std;

const int nmx = 50002;
const int inf = 0x3f3f3f3f;

int n,m,start;
int cost[nmx],dist[nmx];
vector <pair<int,int> > g[nmx];

void reset()
{
    for(int i = 1; i < nmx; ++i)
    {
        g[i].clear();
        dist[i] = inf;
    }
}

void citire()
{
    scanf("%d %d %d", &n, &m, &start);

    for(int i = 1; i <= n; ++i)
        scanf("%d", &cost[i]);

    for(int i = 1; i <= m; ++i)
    {
        static int nod1,nod2,cost;
        scanf("%d %d %d", &nod1, &nod2, &cost);

        g[nod1].push_back(make_pair(nod2,cost));
        g[nod2].push_back(make_pair(nod1,cost));
    }
}

void calc_dist()
{
    priority_queue <pair<int,int> > q;

    q.push(make_pair(0,start));
    dist[start] = 0;

    while(not q.empty())
    {
        int nod = q.top().second;
        q.pop();

        for(vector<pair<int,int> >::iterator it = g[nod].begin(); it != g[nod].end(); ++it)
            if(dist[it->first] > dist[nod] + it->second)
            {
                dist[it->first] = dist[nod] + it->second;
                q.push(make_pair(-dist[it->first],it->first));
            }
    }
}

void afish()
{
    bool okay = true;

    for(int i = 1; i <= n && okay; ++i)
        if(dist[i] != cost[i])
            okay = false;

    if(okay)
        printf("DA\n");
    else
        printf("NU\n");
}

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

    int total;

    scanf("%d", &total);

    for(int i = 1; i <= total; ++i)
    {
        reset();
        citire();
        calc_dist();
        afish();
    }

    return 0;
}