Cod sursa(job #688454)

Utilizator attila3453Geiszt Attila attila3453 Data 23 februarie 2012 16:29:21
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <stdio.h>
#include <vector>
#include <deque>

using namespace std;

struct muchie
{
    int sf, cost;
    muchie() {}
    muchie(int a, int b)
    {
        sf = a;
        cost = b;
    }
};

const int inf = 60000000;
vector<muchie> *v;
deque<int> coada;
int i, n, start, end, cost;
int *d2;

void dijkstra(int src)
{
    for(i = 1; i <= n; d2[i++] = inf);
    d2[src] = 0;
    coada.push_back(src);

    while(!coada.empty())
    {
        start = coada.front();

        if(d2[start] != inf)
            for(i = 0; i < (signed)v[start].size(); i++)
            {
                end = v[start][i].sf;
                cost = v[start][i].cost;

                if(d2[start] + cost < d2[end])
                {
                    d2[end] = d2[start] + cost;
                    coada.push_back(end);
                }
            }

        coada.pop_front();
    }
}

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

    int t, x, y, c, m, s;
    int *d;

    scanf("%d", &t);

    while(t--)
    {
        scanf("%d %d %d", &n, &m, &s);

        v = new vector<muchie>[n + 1];
        d = new int[n + 1];
        d2 = new int[n + 1];

        for(i = 1; i <= n; i++)
            scanf("%d", d+i);

        for(i = 0; i < m; i++)
        {
            scanf("%d %d %d", &x, &y, &c);
            v[x].push_back(muchie(y, c));
            v[y].push_back(muchie(x, c));
        }

        dijkstra(s);

        for(i = 1; i <= n; i++)
            if(d[i] != d2[i])
            {
                printf("NU\n");
                break;
            }

        if(i == n + 1)
            printf("DA\n");
    }
}