【问题标题】:Dijkstra algorithm for 2D array in JavaJava中二维数组的Dijkstra算法
【发布时间】:2010-10-30 08:07:33
【问题描述】:

这是一个学校项目;我遇到了很多麻烦,而且我似乎找不到可以理解的解决方案。

   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 调整 C++ 代码.php?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)));
    }
}

【问题讨论】:

    标签: java algorithm multidimensional-array dijkstra


    【解决方案1】:

    您调用二维数组的表示是图形的邻接矩阵表示,您要解决的问题是“单源最短路径”问题的一个实例。 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);
    

    【讨论】:

    • 不幸的是,那个网站对我帮助不大。它不像我需要的那样处理二维数组......还有其他人有解决方案/建议吗?
    • @Babar:很好的方法可以在不溢出所有豆子的情况下将他推向正确的方向。 +1
    • 非常好,类似 TA 的回答 :) +1。
    • @Stan - Babar 鼓励您考虑实现算法,而不是数据结构。这绝对是学习解决方案的更好方法。
    • 谢谢大家--我肯定会尽快研究阅读和实施...虽然大部分时间都在下周--这周我大部分时间都很忙。当我有机会/时间时,我会回复;) !!
    【解决方案2】:

    不知道是否有人仍然对 Dijikstra 的这种矩阵表示感兴趣,但我一直在考虑在 Actionscript 中编码 Dijikstra,因此首先必须自学 Dijuikstra 的工作原理。完成此操作并尝试对其进行编码后,我昨晚才意识到,我可以在矩阵中表示节点和距离,就像您在这篇文章顶部所拥有的那样。我的理论是,找到最短路径将是一件非常简单的事情。我仍在尝试以确保我正确。

    在矩阵中;

    a b c d e z 一 - 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 下“e”。所以路径现在是“a - b - e”,总成本为 4。i 然后查看“e”行,规则应该是找到出现在“e”列之后的最小数字。这将给我“z”并给出完整路径为“a - b - e - z”,总成本为 8。但是,请记住,我昨晚才发现这一点,该方法需要认识到,在查看“e”行的另一种可能性是以 1 的成本进入 d 列。然后在 d 行查看 d 行之后的最小数字,这将以 2 的成本给我“z”行。

    因此这是一个更好的解决方案,路径为“a - b - e - d -z”,总成本为 7,正如您所说的那样。

    好的,我仍然需要在 Actionscript 中编写代码,但我的直觉是在 Actionscript 中编写代码会非常容易。恐怕我没有 Java 经验,但如果你同意我的方法,用 Java 编写代码应该很容易。

    保罗

    【讨论】:

      猜你喜欢
      • 2023-03-30
      • 2015-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多