图(最短路径算法)
关键词:图、最短路径
应用场景:
图论中求最短路径的场景 常用算法:
BFS | DFSFolydDijkstraBellman-FordspfaA*- ...
由于技术有限,本文先针对
lc743介绍BFS、Folyd、Dijkstra、Bellman-Ford在求最短路径问题时的基本用法:
题目描述
Folyd算法
public int networkDelayTime(int[][] times, int n, int k) {
final int INF = 1_000_000;
int[][] matrix = new int[n][n];
for (int i=0;i<n;i++){
Arrays.fill(matrix[i],INF);
}
for (int[] edge:times){
matrix[edge[0]][edge[1]] = edge[2];
}
for (int i=0;i<n;i++){
for (int j=0;j<n;j++){
for (int l=0;l<n;l++) {
if (matrix[j][l] > matrix[j][i]+matrix[i][l]) {
matrix[j][l] = matrix[j][i]+matrix[i][l];
}
}
}
}
int v = Arrays.stream(matrix[k]).max().getAsInt();
return v == INF ? -1:v;
}
Dijkstra 算法
final int INF = 1_000_00;
/**
* @method dijkstra 算法 传统解法 未使用队列优化
* @param times
* @param n
* @param k
* @return
*/
public int networkDelayTime_Dijkstra(int[][] times, int n, int k) {
int[][] matrix = new int[n][n];
for (int i=0;i<n;i++){
Arrays.fill(matrix[i],INF);
matrix[i][i] = 0;
}
for (int[] edge:times) {
matrix[edge[0]-1][edge[1]-1] = edge[2];
}
// dijkstra 算单源最短路径
int[] dis = dijkstra(matrix,k-1);
int v = Arrays.stream(dis).max().getAsInt();
return v == INF ? -1:v;
}
private int[] dijkstra(int[][] matrix,int src) {
int n = matrix.length;
int[] res = Arrays.copyOf(matrix[src],n);
int[] seen = new int[n];
seen[src] = 1;
//
int idx = -1;
for (int k=0;k<n;k++) {
int min = INF;
for (int i=0;i<n;i++) {
if (seen[i] == 0 && res[i] <= min) {
min = res[i];
idx = i;
}
}
// 用idx更新其他
seen[idx] = 1;
for (int j=0;j<n;j++) {
if (res[idx]+matrix[idx][j] < res[j]) {
res[j] = res[idx]+matrix[idx][j];
}
}
}
return res;
}
BF 解法
public int networkDelayTime(int[][] times, int N, int K) {
int[] distance = new int[N];
Arrays.fill(distance,-1);
distance[K-1] = 0;
// BF算法
for(int i=1;i<=N-1;i++){
// 进行N-1轮松弛
for(int[] edge:times)
// 枚举每一条边
if(distance[edge[0]-1]!=-1){
if(distance[edge[1]-1]==-1){
distance[edge[1]-1] = distance[edge[0]-1]+edge[2];
}else{
distance[edge[1]-1] = Math.min(distance[edge[1]-1],distance[edge[0]-1]+edge[2]);
}
}
}
int max = 0;
for(int t:distance){
if(t==-1) return -1;
max = Math.max(max,t);
}
return max;
}