Cod sursa(job #3227015)

Utilizator CookieW101Carla Rusu CookieW101 Data 24 aprilie 2024 09:51:50
Problema Distante Scor 0
Compilator java Status done
Runda Arhiva de probleme Marime 3.77 kb
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;
import java.util.ArrayList;
import java.util.List;
import java.util.PriorityQueue;

public class Bonus {
    static class Task {
        public static final String INPUT_FILE = "distante.in";
        public static final String OUTPUT_FILE = "distante.out";

        // numarul maxim de noduri
        public static final int NMAX = 50005;

        // valoare mai mare decat orice distanta din graf
        public static final int INF = (int) 1e9;

        int n, m, s;  // numar de noduri, numar de muchii, nodul sursa
        List<Integer> distanteBolnav;

        public class Pair implements Comparable<Pair> {
            public int destination;
            public int cost;

            Pair(int _destination, int _cost) {
                destination = _destination;
                cost = _cost;
            }

            public int compareTo(Pair rhs) {
                return Integer.compare(cost, rhs.cost);
            }
        }

        @SuppressWarnings("unchecked")
        ArrayList<Pair> adj[] = new ArrayList[NMAX];

        public void solve() throws IOException {
            Scanner sc = new Scanner(new BufferedReader(new FileReader(INPUT_FILE)));
            BufferedWriter bw = new BufferedWriter(new FileWriter(OUTPUT_FILE));
            int T = sc.nextInt(); // Numar de teste

            for (int t = 0; t < T; t++) {
                int n = sc.nextInt();
                int m = sc.nextInt();
                int s = sc.nextInt();
                List<Integer> distanteBronzares = new ArrayList<>();

                for (int i = 0; i < n; i++) {
                    distanteBronzares.add(sc.nextInt());
                }

                for (int i = 1; i <= n; i++) {
                    adj[i] = new ArrayList<>();
                }

                for (int i = 0; i < m; i++) {
                    int x = sc.nextInt();
                    int y = sc.nextInt();
                    int w = sc.nextInt();
                    adj[x].add(new Pair(y, w));
                    adj[y].add(new Pair(x, w));
                }

                boolean result = checkDistances(n, s, distanteBronzares);
                bw.write(result ? "DA\n" : "NU\n");
            }

            sc.close();
            bw.close();
        }

        private boolean checkDistances(int n, int s, List<Integer> distanteBronzares) {
            List<Integer> d = new ArrayList<>();
            List<Integer> p = new ArrayList<>();
            for (int i = 0; i <= n; i++) {
                d.add(INF);
                p.add(-1);
            }

            d.set(s, 0);
            PriorityQueue<Pair> q = new PriorityQueue<>();
            q.add(new Pair(s, 0));

            while (!q.isEmpty()) {
                Pair top = q.poll();
                int node = top.destination;
                int cost = top.cost;

                if (cost > d.get(node)) {
                    continue;
                }

                for (Pair edge : adj[node]) {
                    int neigh = edge.destination;
                    int w = edge.cost;
                    if (d.get(node) + w < d.get(neigh)) {
                        d.set(neigh, d.get(node) + w);
                        q.add(new Pair(neigh, d.get(neigh)));
                    }
                }
            }

            for (int i = 1; i <= n; i++) {
                if (d.get(i) == INF) {
                    d.set(i, -1);
                }
                if (!distanteBronzares.get(i-1).equals(d.get(i))) {
                    return false;
                }
            }
            return true;
        }
    }

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