package com.renhui.graph;
/**
* 深度优先搜索实现 (无向图)
*/
public class DepthFirstSearch {
private int count; // 记录当前有多少个个顶点与s顶点相通
private boolean[] marked; //索引代表顶点,值表示当前顶点是否已经被搜索
// 构造深度优先搜索对象,使用深度优先搜索找出G图中s顶点的所有相邻顶点
public DepthFirstSearch(Graph g, int s) {
this.marked = new boolean[g.V()];
this.count = 0; // 搜索之前设置为0
dfs(g, s);
}
// 使用深度优先搜索找出G图中v顶点的所有相通的顶点
private void dfs(Graph g, int v) {
// 设置当前顶点已经搜索
marked[v] = true;
for (int w : g.adj(v)) {
// 判断w顶点是否被搜索过,如果没被搜索,递归调用dfs方法进行深度搜索
if (!marked[w]) {
dfs(g, w);
}
}
// 相通顶点数+1
count++;
}
// 判断w顶点与s顶点是否相通
public boolean marked(int w) {
return marked[w]; // 是否被搜索过 即 是否相通
}
// 获取与顶点相通的所有顶点的个数
public int count() {
return count;
}
public static void main(String[] args) {
// 准备一幅图
Graph graph = new Graph(13);
graph.addEdge(0, 5);
graph.addEdge(0, 1);
graph.addEdge(0, 2);
graph.addEdge(0, 6);
graph.addEdge(5, 3);
graph.addEdge(5, 4);
graph.addEdge(3, 4);
graph.addEdge(4, 6);
graph.addEdge(7, 8);
graph.addEdge(9, 11);
graph.addEdge(9, 10);
graph.addEdge(9, 12);
graph.addEdge(11, 12);
// 准备深度优先搜索对象
DepthFirstSearch search = new DepthFirstSearch(graph, 0);
// 测试与某个顶点相通的顶点数量
int count = search.count();
System.out.println("与顶点0相通的个数为:" + count);
// 测试某个顶点与起点是否相通
System.out.println("5和0是否相通:" + search.marked(5));
System.out.println("7和0是否相通:" + search.marked(7));
}
}