用Dijkstra算法求解无向图的最短路径
来源:互联网 发布:php判断是否微信打开 编辑:程序博客网 时间:2024/05/16 14:40
Dijkstra算法是典型的算法。Dijkstra算法是很有代表性的算法。Dijkstra一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN, CLOSE表的方式,这里均采用永久和临时标号的方式。注意该算法要求图中不存在负权边。
微软编程比赛里面的一道难度系数5%的编程题目如下:
Dijkstra算法是用来求解图中顶点到另外其他顶点的最短路径的,根据题目,我们可以把每两个岛屿往来所花的最少金币当成图中的边权值,由此可以用Dijkstra算法来解决这个问题。
根据图来建立权值矩阵:
int[][] W = {
{ 0, 1, 5, -1, -1, -1,-1,-1 ,-1},
{ 1, 0, 3, 7, 5, -1,-1,-1,-1},
{ 5, 3, 0, -1, 1, 7, -1,-1,-1,-1 },
{ -1, 7, -1, 0, 2, -1,3,-1,-1 },
{ -1, 5, 1, 2, 0, 3, 6, 9,-1},
{-1,-1,-1, 3,6,-1, 0, 2, 7}
{-1,-1,-1,-1,9,5,2, 0, 4}
{-1,-1,-1,-1,-1,-1, 7, 4, 0}
};(-1表示两边不相邻,权值无限大)
java代码如下:
package wxt;import java.util.ArrayList;import java.util.List;import java.util.Scanner;//这个算法用来解决无向图中任意两点的最短路径 public class Dijkstra { public static int dijkstra(int[][] W1, int start, int end) { boolean[] isLabel = new boolean[W1[0].length];// 是否标号 int[] indexs = new int[W1[0].length];// 所有标号的点的下标集合,以标号的先后顺序进行存储,实际上是一个以数组表示的栈 int i_count = -1;//栈的顶点 int[] distance = W1[start].clone();// v0到各点的最短距离的初始值 int index = start;// 从初始点开始 int presentShortest = 0;//当前临时最短距离 indexs[++i_count] = index;// 把已经标号的下标存入下标集中 isLabel[index] = true; while (i_count<W1[0].length) { // 第一步:标号v0,即w[0][0]找到距离v0最近的点 int min = Integer.MAX_VALUE; for (int i = 0; i < distance.length; i++) { if (!isLabel[i] && distance[i] != -1 && i != index) { // 如果到这个点有边,并且没有被标号 if (distance[i] < min) { min = distance[i]; index = i;// 把下标改为当前下标 } } } if (index == end) {//已经找到当前点了,就结束程序 break; } isLabel[index] = true;//对点进行标号 indexs[++i_count] = index;// 把已经标号的下标存入下标集中 if (W1[indexs[i_count - 1]][index] == -1 || presentShortest + W1[indexs[i_count - 1]][index] > distance[index]) { // 如果两个点没有直接相连,或者两个点的路径大于最短路径 presentShortest = distance[index]; } else { presentShortest += W1[indexs[i_count - 1]][index]; } // 第二步:将distance中的距离加入vi for (int i = 0; i < distance.length; i++) { // 如果vi到那个点有边,则v0到后面点的距离加 if (distance[i] == -1 && W1[index][i] != -1) {// 如果以前不可达,则现在可达了 distance[i] = presentShortest + W1[index][i]; } else if (W1[index][i] != -1 && presentShortest + W1[index][i] < distance[i]) { // 如果以前可达,但现在的路径比以前更短,则更换成更短的路径 distance[i] = presentShortest + W1[index][i]; } } } //如果全部点都遍历完,则distance中存储的是开始点到各个点的最短路径 return distance[end] - distance[start]; } private static class Island{ public int x,y; } public static void main(String[] args) { ArrayList<Island> arr=new ArrayList<Island>(); // 建立一个权值矩阵 int [][] Test={ {0,1,4},{1,0,1},{4,1,0} }; Scanner input=new Scanner(System.in); int num=input.nextInt(); for (int i = 0; i < num; i++) { Island island=new Island(); island.x=input.nextInt(); island.y=input.nextInt(); arr.add(island); } int [][] t=new int[num][num]; for (int i = 0; i < t.length; i++) { for (int j = 0; j < t.length; j++) { t[i][j]=Math.min(Math.abs(arr.get(i).x-arr.get(j).x), Math.abs(arr.get(i).y-arr.get(j).y)); } } System.out.println(dijkstra(t, 0,num-1)); } }
0 0
- 用Dijkstra算法求解无向图的最短路径
- 无向图的最短路径求解算法之——Dijkstra算法
- 无向图的最短路径求解算法之——Dijkstra算法【转】
- 无向图的最短路径求解算法之——Dijkstra算法
- 无向网图的最短路径--Dijkstra算法
- Dijkstra 最短路径算法详解 无向图
- 有向加权图的最短路径算法-Dijkstra
- 无向图的最短路径算法(队列实现 )
- 无向网图的最短路径--Floyd算法
- Dijkstra算法求解最短路径
- 数据结构.图.无向带权&邻接矩阵.最短路径Dijkstra算法
- 基于无向图且权重单一的最短路径Dijkstra算法——JAVA实现
- 带权有向图(最短路径算法Dijkstra算法)
- 图论-有向带权图的最短路径(Dijkstra)算法
- 图的最短路径dijkstra算法
- Dijkstra算法--图的最短路径
- Dijkstra最短路径算法(针对加权有向图)
- Matalab代码 实现 Dijkstra求 有向图及无向图之间,任意两点之间的最短路径
- 同一个project下多个包,其中一个包出现R cannot be resolved to a variable
- ubuntu常见错误--could not get lock /var/lib/dpkg/lock -open
- [Java]Leetcode165 Compare Version Numbers
- 时间区间重叠判断&union&jxl合并单元格
- 往osgOcean中添加自己的模型——海底捞针,找模型
- 用Dijkstra算法求解无向图的最短路径
- App推广干货:一个新的App该如何推广
- POJ 1422 - Air Raid(二分图匹配)
- 改变input标签中placeholder显示的颜色
- SQL语句常用优化技巧(一)
- python执行mapreduce
- Storm 32位(伪分布)
- 黑马程序员——GUI 编程学习
- 垃圾回收机制