题目链接:
不想戳的看下图:
示例:
提示:
解题思路1:
Dijkstra算法(邻接矩阵)
1.将输入的数组转换为一个图,用邻接矩阵表示
dijsktra
2.使用dijsktra算法,求出到所有其他顶点的最短路径和
使用dist来保存最短路径和
3.求出dist里的最大值,即是答案,因为题目要求到达所有点,那么dist里最大值就是答案
如果dist里有初始化的Integer.MAX_VALUE那么说明这点不可达,返回-1
复杂度O(n^2)
代码如下:
class Solution {
public int networkDelayTime(int[][] times, int n, int k) {
int[][] adjustMatrix = buildGraph(times,n);
int ans = 0;
int[] dist = dijsktra(adjustMatrix,n,k);
for (int i = 0; i < n; i++) {
ans = Math.max(ans,dist[i]);
}
return ans==Integer.MAX_VALUE?-1:ans;
}
private int[] dijsktra(int[][] adjMat,int n,int k){
boolean[] visited = new boolean[n];
int[] dist = new int[n];
for (int i = 0; i < n; i++) {
dist[i] = Integer.MAX_VALUE;
}
dist[k-1] = 0;
for (int i = 0; i < n; i++) {
int src = minDistance(dist,n,visited);
visited[src] = true;
for (int dst = 0; dst < n; dst++) {
int toDstDis = dist[src] + adjMat[src][dst];
if(!visited[dst] && adjMat[src][dst]!=Integer.MIN_VALUE &&
dist[src]!=Integer.MAX_VALUE &&
toDstDis<dist[dst]){
dist[dst] = toDstDis;
}
}
}
return dist;
}
//有向带权图的邻接矩阵
private int[][] buildGraph(int[][] times,int n){
int[][] adjustMatrix = new int[n][n];
for (int i = 0; i < adjustMatrix.length; i++) {
Arrays.fill(adjustMatrix[i],Integer.MIN_VALUE);
}
for (int i = 0; i < times.length; i++) {
adjustMatrix[times[i][0]-1][times[i][1]-1] = times[i][2];
}
return adjustMatrix;
}
private int minDistance(int dist[], int n,boolean visited[]) {
int min = Integer.MAX_VALUE, minIndex = -1;
for (int v = 0; v < n; v++) {
if (visited[v] == false && dist[v] <= min) {
min = dist[v];
minIndex = v;
}
}
return minIndex;
}
}
//代码较长,自行理解
解题思路2:
Dijkstra 优先队列(堆优化)
解题思路3:
广度优先搜索
解题思路4:
SPFA
注:因篇幅有限,以上几种算法留给同学们自行拓展。
小结
这题其实就是关于图的最短路径算法。解题方法多种多样,同学们可以根据喜好自行选择。
如果都会就更好了。