算法初学-迪杰斯特拉算法(Dijkstra)

——————————————————————迪杰斯特拉算法————————————————————————

目的:解决单元最短路径问题(从一个节点到另一个节点的最短路径)

限制:不能处理带负边权的情况

准备:

    map[][]:存储各条边的情况(注意是单向边,即map[1][2]是从点1到点2的距离,如果路不通,则将其中的值设置为足够大(表示此路不通))

    dist[]:记录数组,记录当前点到各个点的最短距离。

    set[]:标记数组,假设经过一个点V1,那么set[V1]=0要变为set[V1]=1,即该点已经被访问过。

基本代码:

JAVA版

 1 import java.util.Scanner;
 2 
 3 public class Dijkstra {
 4 
 5     public static void main(String[] args) {
 6         // TODO Auto-generated method stub
 7         Scanner scanner = new Scanner(System.in);
 8         int map[][] = new int[100][100];//矩阵
 9         int dist[] = new int[100];//距离数组
10         int visited[] = new int[100];//标记数组
11         int n = scanner.nextInt();
12         
13         //将每条通道设置为9999,即不可通过
14         for(int i=1; i<=n;i++) {
15             for(int j=1;j<=n;j++) {
16                 map[i][j]=9999;
17             }
18         }
19         
20         int edges = scanner.nextInt();//路径数量
21         for(int i=1;i<=edges;i++) {
22             int a = scanner.nextInt();//起始点
23             int b = scanner.nextInt();//终点
24             map[a][b] = scanner.nextInt();
25         }
26         
27         //初始化dist数组
28         for(int i=1;i <= n;i++) {
29             dist[i] = map[1][i];
30         }
31         
32         
33         int temp=0;//暂存,用来记录这个点与它相连点的最短距离的点的标号。
34         for(int i=1;i<=n;i++) {
35             int min=999;
36             for(int j=1;j<=n;j++) {
37                 if(visited[j]==0&&dist[j]<min) {
38                     min = dist[j];
39                     temp = j;
40                 }
41             }
42             visited[temp] = 1;//标记该点已经来过
43             
44             //来更新dist数组的距离,可以理解为已经经过的点组成的图 到 未经过的图的最短距离。
45             for(int k=1 ;k<=n;k++) {
46                 if(dist[k]>dist[temp]+map[temp][k]) {
47                     dist[k] = dist[temp] + map[temp][k];
48                 }
49             }
50         }
51         
52         
53         for(int i=1;i<=n;i++) {
54             System.out.println(dist[i]);
55         }
56     
57     }
58 
59 }
View Code

 C++版

原文地址:https://www.cnblogs.com/Angfe/p/13738052.html