Cod sursa(job #3296566)

Utilizator beatrice.salavastruBeatrice Elena Salavastru beatrice.salavastru Data 13 mai 2025 19:27:51
Problema Distante Scor 10
Compilator java Status done
Runda Arhiva de probleme Marime 2.98 kb
import java.io.*;
import java.util.*;

public class Main {
    static class Task {
        public static final String INPUT_FILE  = "distante.in";
        public static final String OUTPUT_FILE = "distante.out";
        private static final int INF = (int)1e9;

        public void solve() {
            try (
                    Scanner sc = new Scanner(new FileReader(INPUT_FILE));
                    PrintWriter pw = new PrintWriter(new FileWriter(OUTPUT_FILE))
            ) {
                int T = sc.nextInt();
                for (int tc = 0; tc < T; tc++) {
                    int N = sc.nextInt();
                    int M = sc.nextInt();
                    int S = sc.nextInt();
                    
                    int[] given = new int[N+1];
                    for (int i = 1; i <= N; i++) {
                        given[i] = sc.nextInt();
                    }

                    List<int[]>[] adj = new ArrayList[N+1];
                    for (int i = 1; i <= N; i++) {
                        adj[i] = new ArrayList<>();
                    }
                    for (int i = 0; i < M; i++) {
                        int a = sc.nextInt();
                        int b = sc.nextInt();
                        int c = sc.nextInt();
                        adj[a].add(new int[]{b, c});
                        adj[b].add(new int[]{a, c});
                    }
                    
                    int[] dist = new int[N+1];
                    boolean[] done = new boolean[N+1];
                    for (int i = 0; i <= N; i++) dist[i] = INF;
                    dist[S] = 0;

                    PriorityQueue<int[]> pq = new PriorityQueue<>(
                            Comparator.comparingInt(pair -> pair[1])
                    );
                    pq.add(new int[]{S, 0});

                    while (!pq.isEmpty()) {
                        int[] top = pq.poll();
                        int u = top[0], du = top[1];
                        if (done[u]) continue;
                        done[u] = true;
                        for (int[] e : adj[u]) {
                            int v = e[0], w = e[1];
                            if (!done[v] && du + w < dist[v]) {
                                dist[v] = du + w;
                                pq.add(new int[]{v, dist[v]});
                            }
                        }
                    }
                    
                    boolean ok = true;
                    for (int i = 1; i <= N; i++) {
                        if (dist[i] == INF) {
                            if (given[i] != -1) { ok = false; break; }
                        } else {
                            if (given[i] != dist[i]) { ok = false; break; }
                        }
                    }

                    pw.println(ok ? "DA" : "NU");
                }
            } catch (IOException e) {
                throw new UncheckedIOException(e);
            }
        }
    }

    public static void main(String[] args) {
        new Task().solve();
    }
}