给定有向图,设计一个算法,找出两个结点之间是否存在一条路径
通过图的遍历,比如深度优先或者广度优先搜索等,就能解决这个问题
从结点的其中一个出发,在遍历过程中,检查是否找到另一个结点即可
在遍历过程中,访问过的结点都应被标记为“已访问”,以避免重复访问
深度优先实现起来比较简单,递归即可
但广度优先很适合用来找最短路径,深度优先在访问临近结点之前需要先深度遍历其中一个临近结点
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;
}
}