Cod sursa(job #3223242)

Utilizator Victor2006Nicola Victor-Teodor Victor2006 Data 12 aprilie 2024 19:33:16
Problema Distante Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <stdio.h>
#include <vector>
#define N 50000
#define INF (1LL << 62)

int dis[1 + N];
bool exista_drum[1 + N];
int n, m;

bool exista_drumuri() {
    for ( int i = 1; i <= n; i ++ )
        if ( !exista_drum[i] )
            return false;
    return true;
}

int main() {
    FILE *fin, *fout;
    int t, s, x, y, c;

    fin = fopen("distante.in", "r");
    fout = fopen("distante.out", "w");
    fscanf(fin, "%d", &t);
    while ( t -- ) {
        fscanf(fin, "%d%d%d", &n, &m, &s);
        for ( int i = 1; i <= n; i ++ ) {
            fscanf(fin, "%d", &dis[i]);
            exista_drum[i] = false;
        }
        exista_drum[s] = true;
        
        bool ok = true;
        for ( int i = 1; i <= m; i ++ ) {
            fscanf(fin, "%d%d%d", &x, &y, &c);
            if ( dis[x] + c < dis[y] ) {
                ok = false;
                break;
            }
            else if ( dis[x] + c == dis[y] ) {
                exista_drum[y] = true;
            }

            if ( dis[y] + c < dis[x] ) {
                ok = false;
                break;
            }
            else if ( dis[y] + c == dis[x] ) {
                exista_drum[x] = true;
            }
        }

        if ( ok && dis[s] == 0 )
            fprintf(fout, "DA\n");
        else
            fprintf(fout, "NU\n");
    }
    fclose(fin);
    fclose(fout);
    return 0;
}