題目:給出一張圖,找出圖中從起始點到目的地的所有路徑?找出最近的路徑
這個題目要實現:
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
最短路徑算法 參考: