This question is part of the Competitive Programming 3 book however I haven’t quite reached that chapter yet. Let me see how my approach to solving this problem changes once I get there.
Below is the way I would have done it without having reading the book.
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.PriorityQueue;
import java.util.Scanner;
/**
*
* @author Sanchit M. Bhatnagar
* @see http://uhunt.felix-halim.net/id/74004
*
*/
public class P1112 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
PrintWriter out = new PrintWriter(System.out);
int zz = sc.nextInt();
for (int i = 0; i < zz; i++) {
if (i != 0)
out.println();
int N = sc.nextInt();
int E = sc.nextInt() - 1;
int T = sc.nextInt();
int M = sc.nextInt();
Node[] graph = new Node[N];
for (int j = 0; j < N; j++) {
graph[j] = new Node(j);
}
for (int j = 0; j < M; j++) {
int a = sc.nextInt() - 1;
int b = sc.nextInt() - 1;
int c = sc.nextInt();
graph[a].add(graph[b], c);
}
int[] shortest = new int[N];
for (int j = 0; j < N; j++) {
if (shortest[j] == 0) {
Object[] output = dfs(graph, j, E);
if (output != null) {
@SuppressWarnings("unchecked")
ArrayList<Integer> tmp = (ArrayList<Integer>) output[0];
int cost = (int) output[1];
int size = tmp.size();
int thing = 0;
shortest[tmp.get(0)] = cost;
for (int k = 1; k < size; k++) {
thing += graph[tmp.get(k - 1)].cost.get(tmp.get(k));
shortest[tmp.get(k)] = cost - thing;
}
} else {
shortest[j] = -1;
}
for (int k = 0; k < N; k++) {
graph[k].visited = false;
}
}
}
int ans = 0;
for (int j = 0; j < N; j++) {
if (shortest[j] <= T && shortest[j] != -1) {
ans++;
}
}
out.println(ans);
}
out.close();
sc.close();
}
@SuppressWarnings("unchecked")
private static Object[] dfs(Node[] graph, int j, int e) {
PriorityQueue<Object[]> queue = new PriorityQueue<Object[]>(1, new Comparator<Object[]>() {
@Override
public int compare(Object[] o1, Object[] o2) {
return Integer.compare((int) o1[2], (int) o2[2]);
}
});
queue.add(new Object[] { graph[j], new ArrayList<Integer>(), 0 });
while (!queue.isEmpty()) {
Object[] next = queue.poll();
Node n = ((Node) next[0]);
((ArrayList<Integer>) next[1]).add(n.idx);
n.visited = true;
if (n.idx == e) {
return new Object[] { next[1], next[2] };
} else {
for (Integer in : n.cost.keySet()) {
if (!graph[in].visited) {
ArrayList<Integer> tmp = new ArrayList<Integer>();
tmp.addAll((ArrayList<Integer>) next[1]);
queue.add(new Object[] { graph[in], tmp, (int) next[2] + n.cost.get(in) });
}
}
}
}
return null;
}
private static class Node {
boolean visited;
int idx;
HashMap<Integer, Integer> cost;
public Node(int idx) {
this.idx = idx;
cost = new HashMap<Integer, Integer>();
}
public void add(Node n, int cost) {
if (this.cost.containsKey(n.idx)) {
int tmp = this.cost.get(n);
this.cost.put(n.idx, Math.min(tmp, cost));
} else {
this.cost.put(n.idx, cost);
}
}
}
}
Like this:
Like Loading...