找出兩個點之間的所有路徑(原創)


  題目:給出一張圖,找出圖中從起始點到目的地的所有路徑?找出最近的路徑

  這個題目要實現:

      1、無向連通圖中兩點間的所有路徑。

      2、路徑中不能包含環路或重復的點。

      3、找出最近的一條路徑。

  采用的是DFS,解題思路與迷宮問題,12345所有組合類似。

                    

之前想的用鄰接表作為數據結構,但是鄰接表需要兩個類,比較麻煩,所以修改了一下,每個頂點里面包含編號和與它相連的頂點鏈表。

    static class Vexnode
    {
        int index;
        List<Vexnode> list;
    }
    public static void findPath(Vexnode curNode,Vexnode endNode,boolean visited[],Stack<Integer> stack)
    {
        if(curNode==null || visited[curNode.index]==true)   //假如當前點已經訪問過,就返回
            return;
        stack.push(curNode.index);//當前點入棧
        visited[curNode.index]=true;//當前點已經訪問
        if(curNode.index==endNode.index)//如果當前點是目標點,輸出
        {
            System.out.println(getMessage(stack));
            visited[curNode.index]=false;
            stack.pop();
            return;
        }
        List<Vexnode> list=curNode.list;//當前點鏈表
        for(int i=0;i<list.size();i++)//對相連的每個頂點進行搜索
        {
            findPath(list.get(i), endNode, visited, stack);
        }
        visited[curNode.index]=false;//搜索完畢后彈出,標志清除
        stack.pop();
    }
    
    private static String getMessage(Stack<Integer> stack)
    {
        Iterator<Integer> iterator=stack.iterator();
        String messageString="";
        while(iterator.hasNext())
        {
            messageString+=iterator.next()+"->";
        }
        if(stack.size()==0)
            return messageString;
        return messageString.substring(0,messageString.length()-2);
    }

測試用例:

    public static void main(String[] args) {
        Vexnode v1=new Vexnode();
        v1.index=1;
        Vexnode v2=new Vexnode();
        v2.index=2;
        Vexnode v3=new Vexnode();
        v3.index=3;
        Vexnode v4=new Vexnode();
        v4.index=4;
        Vexnode v5=new Vexnode();
        v5.index=5;
        Vexnode v6=new Vexnode();
        v6.index=6;
        Vexnode v7=new Vexnode();
        v7.index=7;
        Vexnode v8=new Vexnode();
        v8.index=8;
        Vexnode v9=new Vexnode();
        v9.index=9;
        
        List<Vexnode> l1=new ArrayList<Main.Vexnode>();
        List<Vexnode> l2=new ArrayList<Main.Vexnode>();
        List<Vexnode> l3=new ArrayList<Main.Vexnode>();
        List<Vexnode> l4=new ArrayList<Main.Vexnode>();
        List<Vexnode> l5=new ArrayList<Main.Vexnode>();
        List<Vexnode> l6=new ArrayList<Main.Vexnode>();
        List<Vexnode> l7=new ArrayList<Main.Vexnode>();
        List<Vexnode> l8=new ArrayList<Main.Vexnode>();
        List<Vexnode> l9=new ArrayList<Main.Vexnode>();
        
        l1.add(v2);
        l1.add(v4);
        v1.list=l1;
        
        l2.add(v1);
        l2.add(v3);
        l2.add(v5);
        v2.list=l2;
        
        l3.add(v2);
        l3.add(v6);
        v3.list=l3;
        
        l4.add(v1);
        l4.add(v7);
        v4.list=l4;
        
        l5.add(v2);
        l5.add(v6);
        l5.add(v8);
        v5.list=l5;
        
        l6.add(v3);
        l6.add(v5);
        l6.add(v9);
        v6.list=l6;
        
        l7.add(v4);
        l7.add(v8);
        v7.list=l7;
        
        l8.add(v5);
        l8.add(v7);
        l8.add(v9);
        v8.list=l8;
        
        l9.add(v6);
        l9.add(v8);
        v9.list=l9;
        
        boolean[] visited=new boolean[10];
        Stack<Integer> stack=new Stack<Integer>();
        findPath(v1, v9, visited, stack);
    }

輸出:

1->2->3->6->5->8->9
1->2->3->6->9
1->2->5->6->9
1->2->5->8->9
1->4->7->8->5->2->3->6->9
1->4->7->8->5->6->9
1->4->7->8->9

 最短路徑算法  參考:

 dijkstra算法

 dijkstra算法 JAVA實現

 dijkstra算法

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM