在求解单源路径问题时存在一个简单的算法,这个算法通称Dijkstra算法,这个算法是基于贪心法的。算法课上尝试编写了这样一个算法,代码如下:
package com.sailor.greedy;
import java.util.LinkedList;
import java.util.List;
/**
* 单源最短路径问题
*
* @author Sailor
*
*/
public class ShortestPaths {
private static String showPath[] = { "", "", "", "", "", "" };
// 返回图的最短路径
public static int[] getShortPath(int path[][]) {
LinkedList<Integer> savePath = new LinkedList<Integer>();// 用于保存已添加进来的节点
int mark = 1;
int shortestPath[] = new int[path.length];
for (int i = 0; i < shortestPath.length; i++) {
shortestPath[i] = -1;
}
savePath.add(new Integer(0));
if (savePath.size() == 1) {
int num = savePath.getLast().intValue();
int minIndex = 0;
for (int j = 0; j < shortestPath.length; j++) {
shortestPath[j] = path[num][j];
if (shortestPath[j] >= 0) {
showPath[j] = "1-->" + (j + 1);
} else {
showPath[j] = "无通路";
}
}
minIndex = getAddIndex(savePath, shortestPath);
savePath.add(minIndex);
}
if (savePath.size() > 1) {
while (mark < 6) {// savePath.size()<6 当有不可到达的点是将要出现死循环
int num = savePath.getLast().intValue();
int minIndex = 0;
for (int j = 0; j < path.length; j++) {
if (path[num][j] >= 0) {
if (shortestPath[j] < 0) {
shortestPath[j] = path[num][j] + shortestPath[num];
showPath[j] = showPath[num] + "-->" + (j + 1);
} else {
if (shortestPath[num] + path[num][j] < shortestPath[j]) {
shortestPath[j] = shortestPath[num]
+ path[num][j];
showPath[j] = showPath[num] + "-->" + (j + 1);
}
}
}
}
minIndex = getAddIndex(savePath, shortestPath);
if (minIndex > 0)
savePath.add(minIndex);
mark++;
}
}
return shortestPath;
}
// 获得加入到保存路径的节点
public static int getAddIndex(List list, int num[]) {
int index = 0;
for (int i = 0; i < num.length; i++) {
if (!list.contains(new Integer(i))) {
if (num[i] > 0 && index == 0) {
index = i;
}
if (num[i] > 0 && index > 0) {
if (num[i] < num[index])
index = i;
}
}
}
return index;
}
public static void main(String[] args) {
int path[][] = { { 0, -1, 15, -1, -1, -1 }, { 2, 0, -1, -1, 10, 30 },
{ -1, 4, 0, -1, -1, 10 }, { -1, -1, -1, 0, -1, -1 },
{ -1, -1, -1, 15, 0, -1 }, { -1, -1, -1, 4, 10, 0 } };
int shortestPaht[] = getShortPath(path);
for (int i = 0; i < shortestPaht.length; i++) {
System.out.print("节点 1 到节点 " + (i + 1) + " 的最短距离是"
+ shortestPaht[i] + "\t");
System.out.println("路径为:" + showPath[i]);
}
}
}
使用动态规划来求解每对节点之间的最短路径问题,由于图中的节点是可以转换为矩阵表示法的,所以我们可以通过求解矩阵中每对节点的最短路径来达到求解图中节点最短路径的问题。下面是一个使用动态规划来解决这类问题的一个例子:
package com.sailor.dynamic;
/**
*
* 使用动态规划的方法求取每对节点之间的最短路径
*
* @author sailor
*
*/
public class ShortestPath_Dynamic {
// 求取最短路径
public static String[][] getShortestPath(int data[][]) {
int length = data.length;
String pathShow[][] = new String[length][length];
for (int i = 0; i < data.length; i++)
for (int j = 0; j < data[i].length; j++) {
if (data[i][j] > 0)
pathShow[i][j] = (i + 1) + "-->" + (j + 1);
else
pathShow[i][j] = "不通";
}
int k = 0;
while (k < length) {// 循环将各行加入,即计算将k作为最大通过节点之后的最短路径
for (int i = 0; i < length; i++) {
if (data[k][i] > 0) {// 如果这个节点连通了其他节点,则察看是否将影响到当前的最短路径
for (int m = 0; m < length; m++) {
int temp[] = data[m];
if (temp[k] > 0) {// 如果加入当前节点和加入的节点之间是相通的,执行下面的
if (temp[i] < 0) {
if (i != m) {
temp[i] = temp[k] + data[k][i];
pathShow[m][i] = (m + 1) + "-->" + (k + 1)
+ "-->" + (i + 1);
}
} else {
temp[i] = Math.min(temp[k] + data[k][i],
temp[i]);
pathShow[m][i] = pathShow[m][k] + "-->"
+ (i + 1);
}
}
data[m] = temp;
}
}
}
k++;
}
return pathShow;
}
public static void main(String[] args) {
int data[][] = { { -1, 1, 2, -1, -1, -1 }, { -1, -1, 1, 3, -1, 7 },
{ -1, -1, -1, 1, 2, -1 }, { -1, -1, -1, -1, -1, 3 },
{ -1, -1, -1, -1, -1, 6 }, { -1, -1, -1, -1, -1, -1 } };
String pathShow[][] = getShortestPath(data);
for (int i = 0; i < data.length; i++) {
for (int j = 0; j < data[i].length; j++) {
if (data[i][j] > 0) {
System.out.print("节点" + (i + 1) + "到节点" + (j + 1)
+ "的最短路径是:" + data[i][j]);
System.out.println(" 路径是" + pathShow[i][j]);
}
}
}
System.out.println("其余没列出的节点之间是不通的");
}
}
- 大小: 13.8 KB
- 大小: 17.5 KB
分享到:
相关推荐
根据给定的信息,本文将详细解释Java实现的最短路径问题动态规划算法。该程序的主要目的是寻找图中各个节点到指定终点的最短路径,并输出每个节点到终点的最短距离以及达到这些最短距离时的决策路径。 ### 1. 问题...
下面我们将详细讨论如何在Java中通过文件操作来解决最短路径问题。 首先,我们需要了解最短路径算法。其中,Dijkstra算法和Floyd-Warshall算法是两种常用的方法。Dijkstra算法适用于单源最短路径问题,而Floyd-...
本主题聚焦于使用Java实现求解迷宫最短路径的算法。在给定的压缩包中,包含两个文件:ShortPath.java和Position.java,它们分别代表了核心算法和坐标位置的数据结构。 首先,`Position.java`文件可能定义了一个类,...
在计算机科学中,最短路径...总之,Java实现的迪杰斯特拉算法为我们提供了解决最短路径问题的有效工具。通过理解算法的工作原理和Java实现细节,我们可以灵活地应用于各种图结构问题,为软件开发和数据分析带来便利。
Floyd-Warshall算法是一种经典的解决图中所有顶点对最短路径问题的算法,由美国计算机科学家Robert W. Floyd于1962年提出。该算法的核心思想是逐步考虑更多的中间节点,通过动态规划的方式更新最短路径。在Java中...
JAVA版动态规划解决最短路径问题 啊
最短路径问题是一个经典的问题,寻找无向图中的最短路径有着广泛的应用,比如路由选择、网络优化等。本项目以Java语言实现了求解无向图所有最短路径的算法。 1. **Dijkstra算法** Dijkstra算法是最常用的单源最短...
算法实验,实现了图的单元最短路径的查找,希望有所帮助
采用的是分枝定界算法,效率较低
单源最短路径问题在图论中是一个经典问题,它要求找出从图中一个特定顶点(源点)到其他所有顶点的最短路径。在这个场景中,我们使用了分支限界法来解决这个问题。分支限界法是一种搜索算法,通常用于优化问题,它...
java实现最短路径搜索,并选出最短路径
这个问题通常称为单源最短路径问题. 输入: 第一行为一个整数n,表示包含源在内的顶点的个数,接下来是一个n*n的矩阵,矩阵中-1表示此路不通,否则表示从该顶点到另一顶点的距离。例如对于上图所示的问题我们可以按...
总结来说,解决"java 具有图形界面的最短路径问题的求解"需要掌握图的表示、最短路径算法(如Dijkstra),以及使用Java GUI库进行界面设计和事件处理。实际的代码实现会涉及数据结构、算法和用户交互等多个方面的...
本篇文章将深入探讨如何使用Java编程语言解决最短路径问题,并结合提供的文件"最短路径"进行分析。 首先,我们要了解几种常见的最短路径算法,包括Dijkstra算法、Bellman-Ford算法以及Floyd-Warshall算法。其中,...
最短路径问题是图论研究中的一个经典算法问题, 旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。 算法具体的形式包括: 确定起点的最短路径问题 - 即已知起始结点,求最短路径的问题。 [1] 确定终点的...
本文将深入探讨如何使用Java语言和Dijkstra算法来解决最短路径问题。 Dijkstra算法是由荷兰计算机科学家艾兹格·迪科斯彻在1956年提出的一种单源最短路径算法。它能够找到一个加权有向或无向图中,从源节点到其他...
在IT行业中,地理信息系统(GIS)的开发与应用经常涉及到空间数据处理,其中包括最短路径的计算。GDAL(Geospatial Data Abstraction Library)是一个强大的开源库,它提供了多种功能,包括读取、写入和操作各种地理...
在这个特定的项目中,我们有一个Java程序,它使用递归算法来解决查询某市地铁的最短路径的问题。递归算法是一种强大的工具,它通过将大问题分解为更小的相似子问题来解决复杂的问题。 首先,我们要理解什么是递归。...
单源最短路径分支界限法是指在图论中,使用分支限界法来解决单源最短路径问题的算法。该算法采用java语言实现,参考了算法设计与分析的方法。 单源最短路径问题是指在一个有权重的图中,找出从一个源节点到其他所有...