数据结构10——最短路径

最短路径:带权图中从一个结点到另外一个结点可能会有多个路径,但是将带权路径长度值最小的一条路径成为最短路径。

1:(Dijkastra)迪克斯特拉算法:

迪克斯特拉算法用于最短路径的方法和prim用于最小生成树的方法类似都是按照路径权值由小到大的顺序来产生最短路径。

主要思想:设置两个集合的结点S和T,集合S用于存放已经找到最短路径的结点,

                  集合T中存放当前未找到的最短路径。

与前面的prim算法类似都是通过路径逐渐递增的方式来获得。

迪克斯特拉算法的具体实现:

 1 package com.hone.graph.test;
 2
 3 import com.hone.graph.AdjMWGraph;
 4
 5 /*
 6  * 定义dijkstra算法用来表示最短路径,其中g表示带权值的图形,v0表示初试下标的结点
 7  * distance[]数组用于储存最短路径,path路径用于输出前一个结点的下标
 8  */
 9 public class Dijkstra {
10     static final int maxWeight=9999;                //设定一个初始值表示无穷大
11     public static void dijkstra(AdjMWGraph g,int v0,
12             int [] distance ,int[] path){
13
14         int n=g.getNumOfVertices();                    //获得结点的总个数
15         int[] s=new int [n];                        //定义一个数组用来存储各个结点的标记,0表示没有存储,1表示已经存储
16
17         int minDistance;
18         int u=0;                                    //定义一个用于交换下标的常量
19
20         //初始化各个距离,并且将初始点v0添加到最小路径集合s中去
21         for (int i = 0; i < n; i++) {
22             distance[i]= g.getWeight(v0, i);            //获得v0和i结点构成的边之间的权重
23             s[i]=0;                                        //同时标记i没有被访问
24             if(i!=v0&&distance[i]<maxWeight){            //如果i结点不是v0结点,并且v0和i之间的权重是最小路径,则遍历出v0结点
25                 path[i]=v0;
26             }else{
27                 path[i]=-1;
28             }
29         }
30
31         s[v0]=1;                                    //对s[v0]进行赋值,1表示v0结点已经储存到对相应的集合s中
32
33         /*
34          * 在从没有找到最小路径的结点集合中选出最短路径的结点u
35          */
36         for( int i=1; i<n; i++){
37             minDistance=maxWeight;
38             for (int j = 0; j < n; j++) {
39                 if (s[j]==0&& distance[j]<minDistance) {            //如果j结点没有被访问过
40                     u=j;                                            //将j赋值给u表示u为最短路径
41                     minDistance=distance[j];                        //并且此刻的distance[j]就为最短路径
42                 }
43             }
44
45             //如果不存在路径的时候算法结束
46             if (minDistance==maxWeight) {
47                 return;
48             }
49             s[u]=1;                                        //用于标记u结点已经加入到最短路径集合中去
50
51             //修改从v0到其他节点的最短路径,并且存入到其他路径中去
52             for (int j = 0; j < n; j++) {
53                 if (s[j]==0&&g.getWeight(u, j)<maxWeight&&distance[u]+g.getWeight(u, j)<distance[j]) {
54                     distance[j]=distance[u]+g.getWeight(u, j);
55                     path[j]=u;
56                 }
57             }
58         }
59     }
60 }

迪克斯特拉算法的测试类:

 1 package com.hone.graph.test;
 2
 3 import com.hone.graph.AdjMWGraph;
 4
 5 public class TestDijkstra {
 6
 7     static final int maxVertices=100;
 8
 9     public static void createGraph(AdjMWGraph g,Object[] v
10             ,int n,RowColWeight[] rc,int e)throws Exception{
11
12         //在图中插入结点
13         for (int i = 0; i < n; i++) {
14             g.insetVertex(v[i]);
15         }
16         //在图中插入边
17         for (int i = 0; i < e; i++) {
18             g.insertEdge(rc[i].row, rc[i].col, rc[i].weight);
19         }
20     }
21
22     public static void main(String[] args){
23         AdjMWGraph g=new AdjMWGraph(maxVertices);
24         Character[] a={new Character(‘A‘),new Character(‘B‘),
25                 new Character(‘C‘),new Character(‘D‘),
26                 new Character(‘E‘),new Character(‘F‘)};
27
28         RowColWeight[] rowColWeights={new RowColWeight(0, 2, 5),
29                 new RowColWeight(0, 3, 30),new RowColWeight(1, 0, 2),
30                 new RowColWeight(1, 4, 8),new RowColWeight(2, 1, 15),
31                 new RowColWeight(2, 5, 7),new RowColWeight(4, 3, 4),
32                 new RowColWeight(5, 3, 10),new RowColWeight(5, 4, 18)
33         };
34
35         int n=6,e=9;
36
37         try {
38             createGraph(g, a, n, rowColWeights, e);
39
40             int[] distance=new int[n];
41             int[] path=new int[n];
42
43             Dijkstra.dijkstra(g, 0, distance, path);
44
45             System.out.println("从顶点A到其他个顶点的最短距离为:");
46             for (int i = 1; i < n; i++) {
47                 System.out.println("到顶点:" + g.getValue(i)+ "的最短距离为:"+ distance[i]);
48             }
49
50             System.out.println("从顶点A到其他个顶点的前一项为:");
51             for (int i = 0; i < n; i++) {
52                 if (path[i]!=-1) {
53                     System.out.println("到顶点:" + g.getValue(i)+ "的前一项为:"+ g.getValue(path[i]));
54                 }
55             }
56         } catch (Exception e1) {
57             e1.printStackTrace();
58         }
59     }
60 }
时间: 2024-10-29 19:08:33

数据结构10——最短路径的相关文章

数据结构之最短路径(1) [迪杰斯特拉算法]

迪杰斯特拉算法介绍: 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本思想: 通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算). 此外,引进两个集合S和U.S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求出最短路径的顶点(以及该顶点到起点s的距离). 初始时,S中只有起点s:U中是除s之外的顶点,并且

数据结构——图——最短路径D&amp;F算法

一.Dijkstra算法(贪心地求最短距离的算法) 在此算法中,我按照自己的理解去命名,理解起来会轻松一些. #define MAXSIZE 100 #define UNVISITED 0 #define VISITED 1 #define INFINITY 66666 typedef struct tool { int visited[MAXSIZE]; /*是否已访问的数组,visited[i]表示顶点i已经访问,也就是到顶点i的最短距离已求出*/ int known_shortest_di

数据结构8——最短路径

一.最短路径 最短路径:从图中的某个顶点出发到达另外一个顶点的所经过的边的权重和最小的一条路径. Dijkstra算法 Bellman-Ford算法 Floyd算法 SPFA算法 二.负权问题 如果一个图仅仅是存在负权,但不构成负权回路,又该如何? Dijkstra 算法 观察上图,若 A 作为源点,在第一轮循环后,B 被标记数组标记,但我们发现在第二轮循环中,B 还可以通过 C 点继续进行更新.由此,可以得出结论:Dijkstra 算法不适用于负权图. Bellman_Ford 算法和 SPF

数据结构10:栈和队列

数据结构栈(Stack)和队列(Queue)详解 本章讲解了两种特殊的线性表结构——栈和队列.读者要重点理解栈的“先进后出”原则和队列的“先进先出”原则,体会两种特殊的线性表结构的应用场景. 本章内容: 1. 栈(Stack)的概念和应用及C语言实现 2. 数据结构实践项目之进制转换器 3. 括号匹配算法及C语言实现 4. 队列(Queue):“先进先出”的数据结构 5. 数据结构实践项目之变态的停车场管理系统 6. 扑克牌游戏及C语言实现 原文地址:https://www.cnblogs.co

数据结构(10) -- 图的邻接表存储

////////////////////////////////////////////////////////// //图的邻接表存储 ////////////////////////////////////////////////////////// #include <iostream> #include <stdlib.h> using namespace std; //图的邻接表表示法 #define MaxVertexNum 100 enum GraphType{DG,

数据结构10——拓扑排序

一.前人种树 博客:拓扑排序 博客:拓扑排序

图中最短路径算法(Dijkstra算法)(转)

1.Dijkstra 1)      适用条件&范围: a)   单源最短路径(从源点s到其它所有顶点v); b)   有向图&无向图(无向图可以看作(u,v),(v,u)同属于边集E的有向图) c)   所有边权非负(任取(i,j)∈E都有Wij≥0); 2)      算法描述: 在带权图中最常遇到的问题就是,寻找两点间的最短路径问题. 解决最短路径问题最著名的算法是Djikstra算法.这个算法的实现基于图的邻接矩阵表示法,它不仅能够找到任意两点的最短路径,还可以找到某个指定点到其他

采用栈数据结构的二叉树遍历

[前言]树的遍历,根据访问自身和其子节点之间的顺序关系,分为前序,后序遍历.对于二叉树,每个节点至多有两个子节点(特别的称为左,右子节点),又有中序遍历.由于树自身具有的递归性,这些遍历函数使用递归函数很容易实现,代码也非常简洁.借助于数据结构中的栈,可以把树遍历的递归函数改写为非递归函数. 在这里我思考的问题是,很显然,循环可以改写为递归函数.递归函数是否借助栈这种数据结构改写为循环呢.因为函数调用中,call procedure stack 中存储了流程的 context,调用和返回相当于根

数据结构与算法合集

数据结构 [Java] 大话数据结构(1) 线性表之顺序存储结构 [Java] 大话数据结构(2) 线性表之单链表 [Java] 大话数据结构(3) 线性表之静态链表 [Java] 大话数据结构(4) 线性表之循环链表 [Java] 大话数据结构(5) 线性表之双向链表 [Java] 大话数据结构(6) 栈的顺序与链式存储 [Java] 大话数据结构(7) 循环队列和链队列 [Java] 大话数据结构(8) 串的模式匹配算法(朴素.KMP.改进算法) [Java] 大话数据结构(9) 树(二叉树