Pagini recente » Cod sursa (job #350292) | Cod sursa (job #3227015)
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();
}
}