解法一:Dijkstra
import java.util.*;
class Solution {
public int networkDelayTime(int[][] times, int N, int K) {
Point[] points = new Point[N + 1];
for (int i = 1; i <= N; ++i) {
points[i] = new Point(i);
}
for (int[] time : times) {
points[time[0]].next.add(new int[]{time[1], time[2]});
}
Comparator<Integer> comparator = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return points[o1].dis - points[o2].dis;
}
};
PriorityQueue<Integer> heap = new PriorityQueue<Integer>(comparator);
points[K].dis = 0;
heap.offer(K);
int cnt = 0;
while (!heap.isEmpty()) {
int id = heap.poll();
if (points[id].isVisited) {
continue;
}
if (++cnt == N) {
break;
}
points[id].isVisited = true;
for (int[] line : points[id].next) {
if (points[line[0]].isVisited) {
continue;
}
points[line[0]].dis = Math.min(points[line[0]].dis, points[id].dis + line[1]);
heap.offer(line[0]);
}
}
int max = 0;
for (int i = 1; i <= N; ++i) {
max = Math.max(max, points[i].dis);
}
if (max == Integer.MAX_VALUE) {
return -1;
} else {
return max;
}
}
}
class Point {
int id;
int dis;
boolean isVisited;
List<int[]> next;
Point(int id) {
this.id = id;
dis = Integer.MAX_VALUE;
isVisited = false;
next = new ArrayList<>();
}
}
解法二:SPFA
import java.util.*;
class Solution {
public int networkDelayTime(int[][] times, int N, int K) {
Point[] points = new Point[N + 1];
for (int i = 1; i <= N; ++i) {
points[i] = new Point(i);
}
for (int[] time : times) {
points[time[0]].next.add(new int[]{time[1], time[2]});
}
Queue<Integer> queue = new LinkedList<>();
points[K].dis = 0;
queue.offer(K);
while (!queue.isEmpty()) {
int id = queue.poll();
points[id].isVisited = false;
for (int[] line : points[id].next) {
int cur = points[id].dis + line[1];
if (points[line[0]].dis > cur) {
points[line[0]].dis = cur;
if (!points[line[0]].isVisited) {
points[line[0]].isVisited = true;
queue.offer(line[0]);
}
}
}
}
int max = 0;
for (int i = 1; i <= N; ++i) {
max = Math.max(max, points[i].dis);
}
if (max == Integer.MAX_VALUE) {
return -1;
} else {
return max;
}
}
}
class Point {
int id;
int dis;
boolean isVisited;
List<int[]> next;
Point(int id) {
this.id = id;
dis = Integer.MAX_VALUE;
isVisited = false;
next = new ArrayList<>();
}
}