Cod sursa(job #1426925)

Utilizator AplayLazar Laurentiu Aplay Data 30 aprilie 2015 23:43:51
Problema Distante Scor 60
Compilator cpp Status done
Runda utcn_grafuri_training Marime 1.52 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define NMAX 50001

using namespace std;

typedef struct nod {
    int node;
    int cost;
    struct nod* next;
} GRAF;

int n, m, t, start, allGood;
int intrare[NMAX], iesire[NMAX];
GRAF* graf[NMAX];

void solve() {
    GRAF *q;
    for(int i = 1; i <= n; ++i) {
        q = graf[i];
        while(q) {
            if(q->cost + intrare[i] == intrare[q->node])
                iesire[q->node] = 1;
            q = q->next;
        }
        graf[i] = NULL;
    }
}

void newNode(int x, int y, int c) {
    GRAF *q = new GRAF;
    q->node = y;
    q->cost = c;
    q->next = graf[x];
    graf[x] = q;

    q = new GRAF;
    q->node = x;
    q->cost = c;
    q->next = graf[y];
    graf[y] = q;
}

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

    int x, y, c;

    scanf("%d", &t);
    while(t--) {
        memset(iesire, 0, sizeof(int) * NMAX);
        scanf("%d%d%d", &n, &m, &start);
        for(int i = 1; i <= n; ++i) {
            scanf("%d", &intrare[i]);
        }
        for(int i = 0; i < m; ++i) {
            scanf("%d%d%d", &x, &y, &c);
            newNode(x, y, c);
        }

        iesire[start] = 1;
        solve();
        allGood = 1;

        for(int i = 1; i <= n; ++i) {
            if(!iesire[i]) {
                allGood = 0;
                break;
            }
        }

        printf("%s\n", allGood ? "DA" : "NU");
    }

    return 0;
}