设计程序实现图的深度优先遍历算法,包括图的输入、遍历过程、输出等基本操作。 设计程序实现图的广度优先遍历算法,包括图的输入、遍历过程、输出等基本操作。 以0为起点用下图测试第2题算法的正确性。用Java完成.
时间: 2024-12-25 15:25:39 浏览: 10
在设计程序实现图的深度优先遍历(DFS,Depth First Search)和广度优先遍历(BFS,Breadth First Search)算法时,我们需要考虑以下几个步骤:
**深度优先搜索算法(DFS)**:
1. **输入**: 输入通常是一个邻接列表或邻接矩阵表示的图,以及起始节点(如题目中给出的0)。对于邻接列表,每个元素是一对键值对,键是顶点,值是其邻居;对于邻接矩阵,行和列代表顶点,矩阵中的元素表示连接关系。
```java
class Graph {
// 邻接列表示例
Map<Integer, List<Integer>> adjList;
// 其他辅助函数...
}
Graph graph = new Graph();
graph.adjList.put(0, Arrays.asList(1, 2)); // 从0开始,连接到1和2
```
2. **遍历过程**: 使用递归或栈来实现。遍历时,首先访问起始节点,然后对其未访问的邻居进行同样操作,直到所有节点都被访问过。
```java
void dfs(int node) {
visited.add(node); // 标记当前节点已访问
for (int neighbor : adjList.get(node)) {
if (!visited.contains(neighbor)) { // 如果邻居没访问过,继续dfs
dfs(neighbor);
}
}
}
```
3. **输出**: 输出遍历路径或所有可达节点。
```java
List<Integer> path = new ArrayList<>();
dfs(graph, 0, path);
System.out.println("Path from 0: " + path);
```
**广度优先搜索算法(BFS)**:
1. 输入和结构与DFS类似,只是数据结构不同,需要维护一个队列来存储节点。
2. **遍历过程**: 使用队列来进行逐层的节点访问。先放入起始节点,然后每次取出并访问队首节点的所有邻居,再将它们加入队列。
```java
import java.util.LinkedList;
import java.util.Queue;
// 广度优先搜索核心部分
Queue<Integer> queue = new LinkedList<>();
queue.offer(0);
while (!queue.isEmpty()) {
int current = queue.poll(); // 取出队首节点
System.out.print(current + " "); // 输出节点
for (int neighbor : adjList.get(current)) {
if (!visited.contains(neighbor)) {
queue.offer(neighbor); // 将邻居入队
}
}
}
```
为了测试DFS算法,你可以创建一个图,比如:
```java
Graph testGraph = new Graph();
testGraph.adjList = ... // 构建一个有向图,例如 0->1->2, 0->3
```
然后在DFS函数中添加路径验证逻辑。
阅读全文