1. 程式人生 > >解題(DirGraCheckPath--有向圖的遍歷(深度搜索))

解題(DirGraCheckPath--有向圖的遍歷(深度搜索))

題目描述

對於一個有向圖,請實現一個演算法,找出兩點之間是否存在一條路徑。

給定圖中的兩個結點的指標DirectedGraphNode* a, DirectedGraphNode* b(請不要在意資料型別,圖是有向圖),請返回一個bool,代表兩點之間是否存在一條路徑(a到b或b到a)。

 程式碼如下:

 1 package com.yzh.hehe;
 2 
 3 import java.util.ArrayList;
 4 import java.util.Stack;
 5  
 6 
 7 public class
DirGraCheckPath { 8 9 public static void main(String[] args) { 10 // TODO Auto-generated method stub 11 12 } 13 14 public boolean checkPath(UndirectedGraphNode a, UndirectedGraphNode b) { 15 return checkSingle(a, b)||checkSingle(b, a); 16 } 17 18 private
boolean checkSingle(UndirectedGraphNode a, UndirectedGraphNode b) { 19 if (a.label==b.label) { 20 return true; 21 } 22 //深度優先遍歷用堆疊實現(廣度優先遍歷用佇列實現) 23 Stack<UndirectedGraphNode> stack= new Stack<UndirectedGraphNode>(); 24 //
已遍歷的點 25 ArrayList<UndirectedGraphNode> list=new ArrayList<UndirectedGraphNode>(); 26 list.add(a); 27 stack.addAll(a.neighbors); 28 UndirectedGraphNode temp = null; 29 //深度遍歷一個點,看是否目標點,是結束,否則再將此點的連線點放入棧中等待遍歷重複(入棧將連線點中已經在棧中和已遍歷過的點去掉)。 30 while (!stack.isEmpty()) { 31 temp = stack.pop(); 32 if (temp.label==b.label) { 33 return true; 34 } 35 for (UndirectedGraphNode undirectedGraphNode : temp.neighbors) { 36 if (!stack.contains(undirectedGraphNode)&&!list.contains(undirectedGraphNode)) { 37 stack.push(undirectedGraphNode); 38 } 39 } 40 list.add(temp); 41 } 42 return false; 43 } 44 45 } 46 class UndirectedGraphNode { 47 int label = 0; 48 UndirectedGraphNode left = null; 49 UndirectedGraphNode right = null; 50 ArrayList<UndirectedGraphNode> neighbors = new ArrayList<UndirectedGraphNode>(); 51 52 public UndirectedGraphNode(int label) { 53 this.label = label; 54 } 55 }