Cod sursa(job #211997)

Utilizator Mishu91Andrei Misarca Mishu91 Data 3 octombrie 2008 23:41:53
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <cstdio>
#include <queue>
using namespace std;

#define MAX_N 50009
#define INF 0x3f3f3f3f

struct graf {int nod, cost;};
vector <graf> V[MAX_N];
queue <int> Q;
int N,M,K,T;
int S[MAX_N], D[MAX_N];

void citire()
{
    int x,y,z;
    for(int i = 1; i <= N; i++)
        V[i].clear();
    scanf("%d %d %d",&N,&M,&K);
    for(int i = 1; i <= N; ++i)
        scanf("%d",S+i);
    for(int i = 1; i <= M; ++i)
    {
        scanf("%d %d %d",&x,&y,&z);
        graf t;
        t.nod = x;
        t.cost = z;
        V[y].push_back(t);
        t.nod = y;
        V[x].push_back(t);
    }
}

void solve()
{
    memset(D,INF,sizeof D);
    Q.push(K);
    D[K] = 0;

    while(!Q.empty())
    {
        int nod = Q.front();
        Q.pop();

        for(typeof V[nod].begin() p = V[nod].begin(); p < V[nod].end(); p++)
            if(D[p -> nod] > D[nod] + p -> cost)
            {
                D[p -> nod] = D[nod] + p -> cost;
                Q.push(p -> nod);
            }
    }
    for(int i = 1; i <= N; i++)
        if(D[i] != S[i])
        {
            printf("NU\n");
            return;
        }
    printf("DA\n");
}

int main()
{
    freopen("distante.in","rt",stdin);
    freopen("distante.out","wt",stdout);
    scanf("%d",&T);
    while(T--)
    {
        citire();
        solve();
    }
}