經過圖的遍歷,好比深度優先或者廣度優先搜索等,就能解決這個問題java
從結點的其中一個出發,在遍歷過程當中,檢查是否找到另外一個結點便可app
在遍歷過程當中,訪問過的結點都應被標記爲「已訪問」,以免重複訪問spa
深度優先實現起來比較簡單,遞歸便可.net
但廣度優先很適合用來找最短路徑,深度優先在訪問臨近結點以前須要先深度遍歷其中一個臨近結點blog
[java] view plain copy遞歸
- import java.awt.Graphics;
- import java.util.LinkedList;
-
-
- public class Search {
- class Node {
- State state;
- }
- public enum State {
- Unvisited, Visited, Visiting;
- }
- public boolean search(Graphics g, Node start, Node end) {
- LinkedList<Node> q = new LinkedList<Node> ();
- for ( Node u:((Object) g).getNodes() ) {
- u.state = State.Unvisited;
- }
-
- start.state = State.Visiting;
- q.add(start);
-
- Node u;
- while( !q.isEmpty() ) {
- u = q.removeFirst();
- if( null != u) {
- for (Node v:u.getAdjacent()) {
- if (v.state == State.Unvisited) {
- if ( v == end) { return true;}
- else {
- v.state = State.Visiting;
- q.add(v);
- }
- }
- }
- u.state = State.Visited;
- }
- }
- return false;
- }
- }
注:也能夠使用深度優先,深度優先搜索實現起來比較簡單,由於只需簡單的遞歸便可。廣度優先搜索很適合用來查找最短路徑,而深度優先搜索在訪問鄰近結點以前,可能會先深度遍歷其中一個鄰近結點。ip