前言:基于上上一篇文章的续尾,我们得为了来减少时间的复杂度,所以我们来开始介绍本文的主题Dijkstra算法。
思想:本节介绍的求最短路径的算法是一种基于贪心策略的算法,每次新扩展一个路程最短的点,更新与其相邻的点的路程。当所有边权都为正时,由于不会存在一个路程更短的扩展过的点,所以这个点得路程永远不会再被改变,因而保证了算法的正确性。
时间复杂度:时间复杂度为 n 的平方,因为我们要先查找每一次最短边确定为离远点最近的确定点。这里就需要花费时间为 n ,然后总个数又为 n。 所以复杂度为 n 方。
理解了这个算法的思想后其实也就学会了 我们也不用讲太多直接上代码
import java.util.Scanner;
//求出单点到各个点得距离
//案例
//6 9
//1 2 1
//1 3 12
//2 3 9
//2 4 3
//3 5 5
//4 3 4
//4 5 13
//4 6 15
//5 6 4
//0 1 8 4 13 17
public class Dijkstra {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int m = scanner.nextInt();
int [][]arrays = new int[n+1][n+1];
int []books = new int[n+1];
int []dis = new int[n+1];
//初始化临街矩阵
for(int i = 1 ;i <= n; i++) {
for(int k = 1;k <= n; k++) {
if(i == k) {
arrays[i][k] = 0;
}else {
arrays[i][k] = Integer.MAX_VALUE;
}
}
}
//录入数据进入临界矩阵
for(int i = 0 ; i < m ; i++){
int tempx = scanner.nextInt();
int tempy = scanner.nextInt();
int tempw = scanner.nextInt();
arrays[tempx][tempy] = tempw;
}
//初始化第一排数据
for(int i = 1; i <=n; i++) {
dis[i] = arrays[1][i];
}
books[1] = 1;
for(int i = 1;i<=n-1;i++) {
int min = Integer.MAX_VALUE;
int temp = 0;
for(int j = 1; j <= n ;j++) {
if(books[j]==0&&dis[j]<min) {
min = dis[j];
temp = j;
}
}
books[temp] = 1;
for(int g = 1; g <= n;g++) {
if(arrays[temp][g]<Integer.MAX_VALUE) {
if(dis[g]>arrays[temp][g]+dis[temp]) {
dis[g] = arrays[temp][g]+dis[temp];
}
}
}
}
for(int i = 1 ; i <= n;i++) {
System.out.print(dis[i]+" ");
}
scanner.close();
}
}