Cod sursa(job #1001396)

Utilizator cbanu96Banu Cristian cbanu96 Data 24 septembrie 2013 21:46:05
Problema Distante Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <utility>

#define FILEIN "distante.in"
#define FILEOUT "distante.out"

using namespace std;

const int NMAX = 50005;
const int INF  = 0x3f3f3f3f;
vector<int> C[NMAX]; // cost
vector<int> A[NMAX]; // adiacenta
queue<pair<int, int> > Q;
int N, M, S;
int D[NMAX];
int givenD[NMAX];

void dijkstra(int source) {
    memset(D, INF, sizeof(D));
    D[source] = 0;
    Q.push(make_pair(source,0));
    while (!Q.empty()) {
        int d, x;
        x = Q.front().first;
        d = Q.front().second;
        Q.pop();
        for ( int i = 0; i < A[x].size(); i++) {
            if ( d + C[x][i] < D[A[x][i]]) {
                D[A[x][i]] = d + C[x][i];
                Q.push(make_pair(A[x][i], D[A[x][i]]));
            }
        }
    }
}

bool check(int N) {
    int i;
    for ( i = 1; i <= N; i++) {
        if (D[i] != givenD[i])
            return false;
    }
    return true;
}

int main()
{
    freopen(FILEIN, "r", stdin);
    freopen(FILEOUT, "w", stdout);
    int T;
    scanf("%d", &T);
    while(T--) {
        scanf("%d %d %d", &N, &M, &S);
        for ( int i = 1; i <= N; i++) {
            A[i].clear();
            C[i].clear();
        }
        for ( int i = 1; i <= N; i++) {
            scanf("%d", &givenD[i]);
        }
        for ( int i = 1, x, y, d; i <= M; i++) {
            scanf("%d %d %d", &x, &y, &d);
            A[x].push_back(y); C[x].push_back(d);
            A[y].push_back(x); C[y].push_back(d);
        }
        dijkstra(S);
        if(check(N))
            printf("DA\n");
        else
            printf("NU\n");
    }

    return 0;
}