Cod sursa(job #1130085)

Utilizator Alexghita96Ghita Alexandru Alexghita96 Data 28 februarie 2014 11:15:53
Problema Distante Scor 20
Compilator cpp Status done
Runda preoji2014_3_11_12 Marime 1.69 kb
#include <cstdio>
#include <vector>
#include <queue>

#define Nmax 50005
#define INF 0x3f3f3f3f / 2

using namespace std;

int T, N, M, S, Cost[Nmax], Test[Nmax];
vector <pair <int, int> > G[Nmax];
priority_queue <pair <int, int>, vector <pair <int, int> >, greater <pair <int, int> > > Q;

void Citire()
{
    int a, b, c;
    scanf("%d %d %d", &N, &M, &S);
    for (int i = 1; i <= N; ++i)
    {
        G[i].clear();
        scanf("%d", &Test[i]);
        Cost[i] = INF;
    }
    for (int i = 1; i <= M; ++i)
    {
        scanf("%d %d %d", &a, &b, &c);
        G[a].push_back(make_pair(c, b));
        G[b].push_back(make_pair(c, a));
    }
}

void Dijkstra(int start)
{
    int nod;
    vector <pair <int, int> > :: iterator it;
    Q.push(make_pair(0, start));
    Cost[start] = 0;
    while (!Q.empty())
    {
        nod = Q.top().second;
        Q.pop();
        for (it = G[nod].begin(); it != G[nod].end(); ++it)
        {
            if (Cost[it -> second] > Cost[nod] + it -> first)
            {
                Cost[it -> second] = Cost[nod] + it -> first;
                Q.push(make_pair(Cost[it -> second], it -> second));
            }
        }
    }
}

void Verificare()
{
    int ok = 1;
    for (int i = 1; i <= N; ++i)
        if (Test[i] != Cost[i])
        {
            ok = 0;
            break;
        }
    if (ok)
        printf("DA\n");
    else
        printf("NU");
}

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

    scanf("%d", &T);

    for (int i = 1; i <= T; ++i)
    {
        Citire();
        Dijkstra(S);
        Verificare();
    }

    return 0;
}