您的位置:首页 > 其它

算法7-4:宽度优先搜索

2016-03-25 11:21 239 查看
宽度优先搜索的基本思想就是先将源点加入到一个队列中。 每次从队列中取出一个顶点。将该顶点的邻居顶点中没有拜訪过的顶点都加入到队列中。最后直到队列消耗完成为止。

应用

宽度优先搜索能够解决最短路径问题。

而最短路径算法在互联网中应用很广泛,尤其是路由这块。

由于路由追求的是高效,所以每一个路由路径都是通过最短路径计算出来的。假设没有最短路径算法,我们可能就享受不到这么快的网速了。

另外。宽度优先搜索在快递行业也会用到。用于计算最短路径。

代码

import java.util.Stack;

/**
* Created by caipeichao on 14-6-10.
*/
public class BFS {
private int s;
private boolean[] visited;
private int[] edgeTo;

public BFS(Graph G, int s) {
this.s = s;
visited = new boolean[G.V()]; // 注意,这句话不要忘记了
edgeTo = new int[G.V()]; // 注意:这句话不要忘记了
bfs(G);
}

public void bfs(Graph G) {
LinkedQueue<Integer> q = new LinkedQueue<Integer>();
q.enqueue(s);
while (!q.isEmpty()) {
int v = q.dequeue();
for (int w : G.adj(v)) {
if (!visited[w]) {
visited[w] = true; // 注意:这句话不要忘记了
edgeTo[w] = v;
q.enqueue(w);
}
}
}
}

public boolean hasPathTo(int v) {
return visited[v];
}

public Iterable<Integer> pathTo(int v) {
if (!hasPathTo(v)) return null; // 注意,这句话不要忘记了
Stack<Integer> result = new Stack<Integer>();
while (v != s) {
result.add(v);
v = edgeTo[v];
}
return result;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: