Java编程实现深度优先遍历与连通分量代码示例
什么是深度优先遍历?
深度优先遍历是一种常见的图遍历算法,该算法从一个指定的源节点开始遍历图,尽可能深地搜索图中的所有节点。具体实现方式为:首先访问该节点,然后遍历该节点的所有连通节点,如果没有连通节点了,返回到上一级节点继续搜索。
深度优先遍历常被用来寻找图中的连通分量、拓扑排序等问题。
Java实现深度优先遍历
Java实现深度优先遍历一般采用递归实现,主要分为两步:
- 标记当前节点为已访问
- 递归访问当前节点的邻居节点
以下是Java实现深度优先遍历的代码示例:
public class Graph {
private int V; // 图的顶点数
private LinkedList<Integer>[] adj; // 图的邻接表
// 构造函数,初始化图
public Graph(int v) {
V = v;
adj = new LinkedList[v];
for (int i = 0; i < v; ++i)
adj[i] = new LinkedList();
}
// 添加边
void addEdge(int v, int w) {
adj[v].add(w); // 将 w 添加到 v 的链表中
}
// 递归实现深度优先遍历
void DFSUtil(int v, boolean[] visited) {
// 将当前节点标记为已访问
visited[v] = true;
System.out.print(v + " ");
// 遍历当前节点的所有邻居节点
Iterator<Integer> i = adj[v].listIterator();
while (i.hasNext()) {
int n = i.next();
// 如果邻居节点未被访问,则递归访问它
if (!visited[n])
DFSUtil(n, visited);
}
}
// 以指定节点为起点进行深度优先遍历
void DFS(int v) {
boolean[] visited = new boolean[V];
DFSUtil(v, visited);
}
}
连通分量
连通分量是一个无向图被划分为若干个子集,每个子集都是连通的。连通分量可以被用来识别图中的簇状结构。
一个无向图的连通分量可以通过深度优先遍历算法来寻找,如果一个节点被访问了,它所在的连通分量的所有点也会被访问。
以下是Java实现寻找无向图连通分量的代码示例:
public class ConnectedComponents {
private boolean[] visited; // 节点是否已被访问
private int[] id; // 节点所属的连通分量
private int count; // 当前连通分量数
// 构造函数,初始化图
public ConnectedComponents(Graph G) {
visited = new boolean[G.V()];
id = new int[G.V()];
count = 0;
for (int v = 0; v < G.V(); v++) {
if (!visited[v]) {
DFS(G, v);
count++;
}
}
}
// 递归实现深度优先遍历
private void DFS(Graph G, int v) {
visited[v] = true;
id[v] = count;
Iterator<Integer> i = G.adj(v).iterator();
while (i.hasNext()) {
int w = i.next();
if (!visited[w])
DFS(G, w);
}
}
// 判断两个节点是否连通
boolean connected(int v, int w) {
return id[v] == id[w];
}
// 计算当前图的连通分量数
int count() {
return count;
}
// 返回指定节点的连通分量编号
int id(int v) {
return id[v];
}
}
以上就是Java编程实现深度优先遍历与连通分量算法的完整攻略及代码示例。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java编程实现深度优先遍历与连通分量代码示例 - Python技术站