经过图的遍历,好比深度优先或者广度优先搜索等,就能解决这个问题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