[英]Dijkstra algorithm for 2D array in Java
这是一个学校项目; 我遇到了很多麻烦,我似乎无法找到一个可以理解的解决方案。
a b c d e z
a - 2 3 - - -
b 2 - - 5 2 -
c 3 - - - 5 -
d - 5 - - 1 2
e - 2 5 1 - 4
z - - - 2 4 -
这是二维数组。 因此,如果你想找到最短的路径,它来自a,b,e,d,z = 7,和(a,b)=(b,a) - 它会带你到行的相邻的新行路径
有没有人可以帮助我为这个例子实现Dijkstra的算法? 我真的很感激。 (我似乎最喜欢数组,地图和集合让我感到困惑,列表是可管理的 - 虽然我愿意在这一点上研究任何类型的解决方案)
[至少我不只是从网上扯下来源。 我其实想学习这些东西......这真的很难(>。<)]
哦,起点是A,终点是Z.
和大多数人一样,我没有发现算法的概念很难 - 我只能看到编码正确...请帮助吗?
示例代码 - 一位朋友帮我解决了这个问题(虽然它充满了我觉得难以理解的数据结构)我还尝试过改编来自dreamincode.net/forums/blog/martyr2/index.php的C ++代码吗? showentry = 578进入java,但是进展不顺利......
import java.util.*;
public class Pathy{
private static class pathyNode{
public final String name;
public Map<pathyNode, Integer> adjacentNodes;
public pathyNode(String n){
name = n;
adjacentNodes = new HashMap<pathyNode, Integer>();
}
}
//instance variables
//constructors
//accessors
//methods
public static ArrayList<pathyNode> convert(int[][] inMatrix){
ArrayList<pathyNode> nodeList = new ArrayList<pathyNode>();
for(int i = 0; i < inMatrix.length; i++){
nodeList.add(new pathyNode("" + i));
}
for(int i = 0; i < inMatrix.length; i++){
for(int j = 0; j < inMatrix[i].length; j++){
if(inMatrix[i][j] != -1){
nodeList.get(i).adjacentNodes.put(nodeList.get(j),
new Integer(inMatrix[i][j]));
}
}
}
return nodeList;
}
public static Map<pathyNode, Integer> Dijkstra(ArrayList<pathyNode> inGraph){
Set<pathyNode> visited = new HashSet<pathyNode>();
visited.add(inGraph.get(0));
pathyNode source = inGraph.get(0);
Map answer = new TreeMap<pathyNode, Integer>();
for(pathyNode node : inGraph){
dijkstraHelper(visited, 0, source, node);
answer.put(node, dijkstraHelper(visited, 0, source, node));
}
return answer;
}
private static int dijkstraHelper(Set<pathyNode> visited, int sum, pathyNode start, pathyNode destination){
Map<pathyNode, Integer> adjacent = new HashMap<pathyNode, Integer>();
for(pathyNode n : visited){
for(pathyNode m: n.adjacentNodes.keySet()){
if(adjacent.containsKey(m)){
Integer temp = n.adjacentNodes.get(m);
if(temp < adjacent.get(m)){
adjacent.put(m, temp);
}
}
else{
adjacent.put(m, n.adjacentNodes.get(m));
}
}
}
Map<pathyNode, Integer> adjacent2 = new HashMap<pathyNode, Integer>();
Set<pathyNode> tempSet = adjacent.keySet();
tempSet.removeAll(visited);
for(pathyNode n: tempSet){
adjacent2.put(n, adjacent.get(n));
}
adjacent = adjacent2;
Integer min = new Integer(java.lang.Integer.MAX_VALUE);
pathyNode minNode = null;
for(pathyNode n: adjacent.keySet()){
Integer temp = adjacent.get(n);
if(temp < min){
min = temp;
minNode = n;
}
}
visited.add(minNode);
sum += min.intValue();
sum = dijkstraHelper(visited, sum, start, destination);
return sum;
}
//main
public static void main(String[] args){
int[][] input = new int[][] { {-1, 2, 3, -1, -1, -1},
{2, -1, -1, 5, 2, -1},
{3, -1, -1, -1, 5, -1},
{-1, 5, -1, -1, 1, 2},
{-1, 2, 5, 1, -1, 4},
{-1, -1, -1, 2, 4, -1},
};
//-1 represents an non-existant path
System.out.println(Dijkstra(convert(input)));
}
}
您正在调用2D数组的表示形式是图形的邻接矩阵表示,您尝试解决的问题是“单源最短路径”问题的实例。 Dijkstra的算法旨在解决此类问题。 这可能会有所帮助http://renaud.waldura.com/doc/java/dijkstra/ 。 从站点下载代码并阅读文档。 基本上你需要编写类似下面的代码
RoutesMap map = map = new DenseRoutesMap(5);
map.addDirectRoute(City.A, City.B, 2);
map.addDirectRoute(City.A, City.C, 3);
map.addDirectRoute(City.B, City.A, 2);
map.addDirectRoute(City.B, City.D, 5);
map.addDirectRoute(City.B, City.D, 2);
...
DijkstraEngine engine = new DijkstraEngine(map);
int distance = engine.getShortestDistance(City.F);
不知道是否有人仍然对Dijikstra的矩阵表示感兴趣,但我一直在考虑在Actionscript中编码Dijikstra,所以首先要教自己Dijuikstra如何工作。 完成这个并尝试编码后,我昨晚才意识到我可以代表节点,并且在矩阵中有距离,例如你在这篇文章的顶部。 我的理论是找到最短路径将是一件非常简单的事情。 我还在尝试确保我纠正。
在矩阵中;
abcdeza - 2 3 - - - b 2 - - 5 2 - c 3 - - - 5 - d - 5 - - 1 2 e - 2 5 1 - 4 z - - - 2 4 -
我开始查看行“a”(因为这是起点)并选择行中最小的数字为2(在b下)。 所以我把路径写成“a - b”,成本为2.然后我转到b行再次找到b的右边的最小数字(因为我们已经在b节点。这给了我2个以下因此,路径现在是“a - b - e”,总成本为4. i然后查看“e”行,规则应该找到“e”列之后出现的最小数字。这会给我“z”,并给出完整的路径为“a - b - e - z”,总成本为8.但是,记住我昨晚才知道这个,方法需要认识到这一点,同时看着“e”行另一种可能性是以1的成本转到d列。然后查看d行,得到d行之后的最小数字,这将给出“z”行,成本为2。
因此,正如你所说的那样,这是一个更好的解决方案,路径为“a - b - e - d -z”,总成本为7。
好吧我还需要在Actionscript中对此进行编码,但我的直觉是在Actionscript中编写代码非常容易。 害怕我没有Java经验,但如果你同意我的方法,那么用Java编写代码应该很容易。
保罗
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.