最短路径(邻接矩阵)-Dijkstra算法
来源:互联网 发布:淘宝c店详情页尺寸 编辑:程序博客网 时间:2024/05/16 07:55
Dijkstra算法又叫作迪杰斯特拉算法,是利用"贪心法"(在对问题进行求解时,总是做出在当前看来最好的选择策略)设计算法的一个成功范例。
适用条件:带权无环和无负权值
举个栗子:
Dijkstra算法的代码实现如下:
package com.threeTop.www;import java.util.Stack;/** * 邻接矩阵存储方式的Dijkstra算法 * @author wjgs * */public class Dijkstra { //通过下标映射元素值private int[] mapping;//图的二维数组private int[][] matrix;/** * 初始化图的顶点 * @param vertexes 顶点数组 */ public Dijkstra(int []vertexes) { int length=vertexes.length; mapping=new int[length]; matrix=new int[length][length]; //图的二维矩阵 for(int i=0;i<length;i++) {mapping[i]=vertexes[i]; } } /** * 添加具有权值的边 * @param start * @param end * @param value */ public void addEdge(int start,int end,int value) { int x=-1; int y=-1; //寻找坐标 for(int i=0;i<mapping.length;i++) { if(x!=-1&&y!=-1) { break; } if(start==mapping[i]) { x=i; } if(end==mapping[i]) { y=i; } } //判断顶点是否存在 if(x==-1||y==-1||x>mapping.length-1||y>mapping.length-1) { throw new IndexOutOfBoundsException("边的顶点不存在!"); } //增加边的权值 matrix[x][y]=value; } /** * Dijkstra算法实现到各点的最短路径 * @param start */ public void dijkstra(int start) { int length =mapping.length; int x=-1; //记录起始点 for(int i=0;i<length;i++) { if(mapping[i]==start) { x=i; break; } } if(x==-1) { throw new RuntimeException("未找到起始顶点"); } //自动初始化为0,都属于未得到最短路径的顶点 int[]s=new int[length]; //存储v到u的最短距离 int [][] distance=matrix; //存储x到u最短路径时u的前一个顶点 int []path=new int[length]; //初始化path数组 for(int i=0;i<length;i++) { //如果可达就赋值 if(matrix[x][i]>0) { path[i]=x; } else { //不可达,则赋前一个顶点下标为-1 path[i]=-1; } } //先把起始顶点加入s s[x]=1; for(int i=0;i<length;i++) { //首先需要寻找start顶点到各顶点最短的路径 int min=Integer.MAX_VALUE; int v=0; //记录x到各顶点最短的 for(int j=0;j<length;j++) { if(s[j]!=1&&x!=j&&distance[x][j]!=0&&distance[x][j]<min) { min=distance[x][j]; v=j; } } //v 是目前x到各顶点最短的 s[v]=1; //修正最短路径distance及最短距离path for(int j=0;j<length;j++) { if(s[j]!=1&&distance[v][j]!=0&&(min+distance[v][j]<distance[x][j]||distance[x][j]==0)) { //说明加入了中间顶点之后找到了更短的路径 distance[x][j]=min+distance[v][j]; path[j]=v; } } } //打印最短路径值 Stack <Integer>stack=new Stack<Integer>(); for(int i=0;i<length;i++) { if(distance[x][i]!=0) { System.out.println(mapping[x]+"-->"+mapping[i]+" 最短路径长度:"+distance[x][i]); //path存储路径,可以逆序输出,可以借助栈实现正序输出 System.out.print("逆序最短路径输出:"); int index=i; while(index!=-1) { System.out.print(mapping[index]+" "); stack.push(mapping[index]); index=path[index]; } System.out.print("正序最短路径输出:"); while(!stack.isEmpty()) { System.out.print(stack.pop()+" "); } System.out.println(); } } } public static void main(String[] args) {int[] vetexes={1,2,3,4,5,6};Dijkstra graph=new Dijkstra(vetexes);graph.addEdge(1, 2,16);graph.addEdge(2, 1,16);graph.addEdge(1, 3,1);graph.addEdge(3, 1,1);graph.addEdge(1, 5,12);graph.addEdge(5, 1,12);graph.addEdge(1, 6,15);graph.addEdge(6, 1,15);graph.addEdge(2, 4,2);graph.addEdge(4, 2,2);graph.addEdge(2, 6,8);graph.addEdge(6, 2,8);graph.addEdge(3, 5,5);graph.addEdge(5, 3,5);graph.addEdge(4, 6,3);graph.addEdge(6, 4,3);graph.addEdge(5, 6,8);graph.addEdge(6, 5,8);graph.addEdge(4, 5,9);graph.addEdge(5, 4,9);graph.dijkstra(1);}}
0 0
- 最短路径(邻接矩阵)-Dijkstra算法
- Dijkstra算法-最短路径-邻接矩阵表示
- 最短路径算法之Dijkstra算法(邻接矩阵实现)
- Dijkstra 邻接矩阵 单源点最短路径
- DIJKSTRA最短路径算法
- 最短路径算法-dijkstra
- dijkstra最短路径算法
- 最短路径 Dijkstra算法
- 最短路径(Dijkstra算法)
- 最短路径Dijkstra算法
- 最短路径 Dijkstra算法
- Dijkstra最短路径算法
- 最短路径dijkstra算法
- 最短路径 dijkstra算法
- 最短路径Dijkstra 算法
- 最短路径 (Dijkstra算法)
- Dijkstra最短路径算法
- 最短路径(Dijkstra算法)
- 普通二维码和自定义二维码的生成
- Problem A: STL——邮票
- Jenkins进阶系列之——11修改Jenkins用户的密码
- android studio 查看模拟器或者手机sql数据库
- Jenkins进阶系列之——12详解Jenkins节点配置
- 最短路径(邻接矩阵)-Dijkstra算法
- spark 运行问题总结
- Problem B: STL——多重集的插入和删除
- LintCode 44 最小子数组
- Jenkins进阶系列之——13修改Jenkins权限控制
- 最大权闭合图
- 里氏转换
- 字符串的综合使用
- Jenkins进阶系列之——14配置Jenkins用户和权限