Cod sursa(job #2110912)

Utilizator BaldurCronos Baldur Data 21 ianuarie 2018 14:59:43
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <iostream>
#include <fstream>
#include <vector>
#define MAX 50002
using namespace std;
ifstream in ("distante.in");
ofstream out("distante.out");

int Teste, n, m, s, Dist[MAX];
bool verif[MAX];

struct edge {
        int x, y, cost;
} graf[2 * MAX];

void citire() {
        in >> n >> m >> s;

        for (int i = 1; i <= n; i++) {
                in >> Dist[i];
                verif[i] = false;
        }

        for (int i = 1; i <= m; i++)
                in >> graf[i].x >> graf[i].y >> graf[i].cost;
}

bool verificare() {
        if (Dist[s])
                return false;

        verif[s] = true;

        for (int i = 1; i <= m; i++) {
                int X = graf[i].x, Y = graf[i].y, C = graf[i].cost;
                int SumX = Dist[X] + C, SumY = Dist[Y] + C;

                if (SumX < Dist[Y])
                        return false;

                if (SumY < Dist[X])
                        return false;

                if (SumX == Dist[Y])
                        verif[Y] = true;

                if (SumY == Dist[X])
                        verif[X] = true;
        }
        for (int i = 1; i <= n; i++)
                if (!verif[i])
                        return false;

        return true;
}

int main() {
        in >> Teste;

        while (Teste--) {
                citire();
                if (verificare())
                        out << "DA\n";
                else
                        out << "NU\n";
        }

        return 0;
}