算法初学-迪杰斯特拉算法(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 }
C++版