Cod sursa(job #1452373)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 20 iunie 2015 17:09:45
Problema Distante Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>

#define DIM 50100
using namespace std;

int N, M, T, Ver[DIM], Fin[DIM], X, Y, Z, K, S;
vector < int > V[DIM];

int main(){

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

    scanf("%d", &T);

    for(T = T; T; T --){
        scanf("%d %d %d", &N, &M, &S);
        for(int i = 1; i <= N; i ++)
            scanf("%d", &Fin[i]);
        for(int i = 1; i < DIM; i ++)
            V[i].resize(0);
        int ok = 1;
        for(int i = 1; i <= M; i ++){
            scanf("%d %d %d", &X, &Y, &Z);
            V[X].push_back(Y); V[X].push_back(Z);
            V[Y].push_back(X); V[Y].push_back(Z);
        }
        for(int i = 1; i <= N; i ++){
            if(i == S) continue;
            int ok2 = 0, ok3 = 1;
            for(int j = 0; j < V[i].size(); j += 2){
                int poz = V[i][j], cost = V[i][j+1];
                if(Fin[poz] + cost <  Fin[i])
                    ok3 = 0;
                if(Fin[poz] + cost == Fin[i])
                    ok2 = 1;
            }
            if(ok2 == 0 || ok3 == 0){
                ok = 0;
                break;
            }
        }

        if(Fin[S] != 0)
            ok = 0;
        switch(ok){
            case 1:{printf("DA\n");break;}
            case 0:{printf("NU\n");break;}
        }
    }

    return 0;
}