Dijkstra算法
来源:互联网 发布:python 牛b 编辑:程序博客网 时间:2024/06/10 09:28
Dijkstra算法
该算法与Prim算法几乎相同,唯一的区别是对于该算法中每个结点key值保存的不是到最小生成树的最短距离,而是到源结点的最短距离,在每找出一个key值最小的源结点后,依次更新该结点的周围结点的key值,这一步在《算法导论》中叫做relax操作,最后得到一个最短路径树,树中所有结点到源结点的路径都是最短的。两重循环,所以复杂度还是O(v^2),代码如下:
package data_structure;//和Prim算法几乎相同public class DijkstraGraph {public int adj[][] = { { 0, 8, 40, 12, 0 }, { 8, 0, 0, 2, 2 },{ 40, 0, 0, 0, 25 }, { 12, 2, 0, 0, 3 }, { 0, 2, 25, 3, 0 }, };public VertexMatrix[] vertex;// 初始化图,值是随便给的,不过邻接矩阵为对称阵public void iniGraph() {vertex = new VertexMatrix[5];for (int i = 0; i < 5; i++) {// 10000为初始的最大值vertex[i] = new VertexMatrix(10000, null, i);}}public int extractMin() {int min = 10000;int id = 0;for (int i = 0; i < vertex.length; i++) {if (vertex[i].inQueue) {if (vertex[i].key < min) {min = vertex[i].key;id = i;}}}return id;}public void dijkstra(int src) {// 设置最短路径树的源结点vertex[src].key = 0;boolean inQueue = true;while (inQueue) {VertexMatrix u = vertex[extractMin()];//u进入最短路径树u.inQueue = false;for (int i = 0; i < 5; i++) {// 更新工作结点的周围结点的标注,即到源结点的距离if (adj[u.id][i] > 0 && vertex[i].inQueue&& vertex[i].key > u.key + adj[u.id][i]) {vertex[i].parent = u;vertex[i].key = u.key + adj[u.id][i];}}inQueue = false;for (int i = 0; i < 5; i++) {inQueue = inQueue || vertex[i].inQueue;}}}public static void main(String[] args) {// TODO Auto-generated method stubDijkstraGraph graph = new DijkstraGraph();graph.iniGraph();graph.dijkstra(1);for (int i = 0; i < 5; i++)System.out.print(graph.vertex[i].key + " ");}}
0 0
- Dijkstra算法
- dijkstra算法
- Dijkstra算法
- Dijkstra算法
- Dijkstra算法
- Dijkstra算法
- Dijkstra 算法
- Dijkstra算法
- Dijkstra算法
- Dijkstra算法
- Dijkstra 算法
- Dijkstra 算法
- dijkstra算法
- Dijkstra 算法
- Dijkstra算法
- Dijkstra算法
- Dijkstra算法
- dijkstra算法
- 字符串模式匹配————BF、KMP算法基础详解
- ARC forbids Objective-C objects in struct
- Linux cURL命令
- jquery 将元素从disable设置为enable
- 关于现在的实习生活
- Dijkstra算法
- box-sizing属性
- 游戏程序员养成计划 (更新2013.3.19)
- spring-mvc入门(五):使用注解(下)
- MyEclipse9.1 启动和运行速度优化设置
- 曾经开发或者维护过的web项目
- sql 查询重复字段
- VIM编辑多个文件
- watchdog(看门狗)