簡體   English   中英

找到2個節點之間的最小距離

[英]Find the minimum distance beween 2 nodes

誰能幫我找出解決問題的方法。 我需要找到2個給定節點之間的最短路徑。 到目前為止,我已經設法將所有可能的路徑保存在列表中,現在我正在嘗試查找最小距離。 這是我的代碼:

public class A {
    private static int[][] adjacency = new int [6][6];
    static int n = 6;
    private static final int START = 1;
    private static final int END = 4;

    private Map<Integer, LinkedHashSet<Integer>> map = new HashMap();
    private Map<Integer, List<Integer>> pathsFound = new HashMap();

    public void addEdge(int node1, int node2) {
        LinkedHashSet<Integer> adjacent = map.get(node1);
        if(adjacent==null) {
            adjacent = new LinkedHashSet();
            map.put(node1, adjacent);
        }
        adjacent.add(node2);
    }

    public LinkedList<Integer> adjacentNodes(Integer last) {
        LinkedHashSet<Integer> adjacent = map.get(last);
        if(adjacent==null) {
            return new LinkedList();
        }
        return new LinkedList<Integer>(adjacent);
    }

    public static void main(String[] args) {

        LinkedList<Integer> visited = new LinkedList<Integer>();
        visited.add(START);
        A graph = new A();

        for (int i=0;i<n;i++)
            for (int j=0;j<n;j++)
                adjacency[i][j] = 0;    
        adjacency[0][1] = 1;
        adjacency[0][2] = 2;
        adjacency[1][0] = 1;
        adjacency[1][3] = 5;
        adjacency[1][4] = 9;
        adjacency[1][5] = 6;
        adjacency[2][0] = 2;
        adjacency[2][4] = 7;
        adjacency[2][5] = 2;
        adjacency[3][1] = 5;
        adjacency[4][1] = 9;
        adjacency[4][2] = 7;
        adjacency[4][5] = 1;
        adjacency[5][1] = 6;
        adjacency[5][2] = 2;
        adjacency[5][4] = 1;

        graph.addEdge(0,1);
        graph.addEdge(0,2);
        graph.addEdge(1,0);
        graph.addEdge(1,3);
        graph.addEdge(1,4);
        graph.addEdge(1,5);
        graph.addEdge(2,0);
        graph.addEdge(2,4);
        graph.addEdge(2,5);
        graph.addEdge(3,1);
        graph.addEdge(4,1);
        graph.addEdge(4,2);
        graph.addEdge(4,5);
        graph.addEdge(5,1);
        graph.addEdge(5,2);
        graph.addEdge(5,4);

        graph.breadthFirst(visited);
    }

    public void breadthFirst(LinkedList<Integer> visited) {
    LinkedList<Integer> nodes = adjacentNodes(visited.getLast());
    List<List<Integer>> allPaths = new ArrayList<List<Integer>>();
    List<Integer> distances = new ArrayList<Integer>();

    for (int node : nodes) {
        if (visited.contains(node)) 
            continue;
        if (node == END) {
            visited.add(node);
            List<Integer> path = getPath(visited);
            System.out.println(path);
            ??allPaths.add(path);
            visited.removeLast();
            break;
        }
    }

    for (int node : nodes) {
        if (visited.contains(node) || node == END) 
            continue;
        visited.addLast(node);
        breadthFirst(visited);
        visited.removeLast();
    }
    System.out.println(allPaths.get(0));

   }


        public static List<Integer> getPath(LinkedList<Integer> visited) {  
        List<Integer> path = new ArrayList<Integer>();
        for (int node : visited)
            path.add(node);
        return path;    
        }

}

如果我喜歡這個System.out.println(path); 它顯示路徑,這意味着函數getPath()可以工作。 但是當我想將此路徑放在列表中時: allPaths.add(path); 出問題了,因為當我在for循環結束后調用System.out.println(allPaths.get(0)); 我得到一個IndexOutOfBoundException 我真的不明白為什么我的allPaths列表為空...

為什么不遍歷foreach?

for (int number : arrlist) {
    System.out.println("Number = " + number);
}

在填寫距離集合之前,您是否正在調用最后一個代碼片段(在您的問題中)? 您需要在之后而不是之前調用它。

[另外:將來,如果您有異常,則確實需要提供異常消息和堆棧跟蹤。 使您的工作更加輕松...]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM