实现图的深度优先遍历实验步骤
时间: 2023-09-24 15:11:41 浏览: 67
深度优先遍历复原二阶魔方python代码+详细注释+实验报告详细步骤
好的,我可以回答这个问题。首先,让我们先了解一下图的深度优先遍历算法。
深度优先遍历算法(DFS)是一种图遍历算法,它从图的起点开始遍历,先访问起点,然后访问与起点相邻的节点中的一个,再访问这个节点相邻的节点中的一个,以此类推,直到当前节点的所有相邻节点都被访问过为止,然后回溯到上一个节点,继续访问另一个未被访问的相邻节点,以此类推,直到所有节点都被访问为止。
在遍历过程中,DFS 会将已访问的节点标记为已访问,以避免重复访问。
现在,让我们来看一下如何实现图的深度优先遍历算法。
1. 首先,我们需要定义一个图的数据结构,可以使用邻接表或邻接矩阵来表示。
2. 然后,我们需要定义一个栈来存储待访问的节点。
3. 我们从图的起点开始,将起点加入栈中,并将其标记为已访问。
4. 从栈中取出一个节点,访问这个节点,并将与该节点相邻的未访问节点加入栈中。
5. 重复步骤 4,直到栈为空。
6. 如果图是连通的,那么在上述过程中,所有节点都将被访问;如果图是非连通的,那么需要从每个未访问节点开始再进行一次 DFS。
接下来,我将介绍一下我在实验中是如何实现 DFS 的。
实验步骤:
1. 定义一个图的数据结构,我使用了邻接表来表示图。
```c++
struct node {
int to, next;
} edge[100010];
int head[10010], cnt;
void add(int u, int v) {
edge[++cnt].to = v;
edge[cnt].next = head[u];
head[u] = cnt;
}
```
2. 定义一个栈来存储待访问的节点。
```c++
stack<int> s;
```
3. 从图的起点开始,将起点加入栈中,并将其标记为已访问。
```c++
int vis[10010];
void dfs(int s) {
memset(vis, 0, sizeof(vis));
while(!s.empty()) s.pop();
s.push(s);
vis[s] = 1;
}
```
4. 从栈中取出一个节点,访问这个节点,并将与该节点相邻的未访问节点加入栈中。
```c++
while(!s.empty()) {
int u = s.top();
s.pop();
for(int i = head[u]; i; i = edge[i].next) {
int v = edge[i].to;
if(!vis[v]) {
vis[v] = 1;
s.push(v);
}
}
}
```
5. 重复步骤 4,直到栈为空。
完整代码如下:
```c++
#include <bits/stdc++.h>
using namespace std;
struct node {
int to, next;
} edge[100010];
int head[10010], cnt;
void add(int u, int v) {
edge[++cnt].to = v;
edge[cnt].next = head[u];
head[u] = cnt;
}
stack<int> s;
int vis[10010];
void dfs(int s) {
memset(vis, 0, sizeof(vis));
while(!s.empty()) s.pop();
s.push(s);
vis[s] = 1;
while(!s.empty()) {
int u = s.top();
s.pop();
for(int i = head[u]; i; i = edge[i].next) {
int v = edge[i].to;
if(!vis[v]) {
vis[v] = 1;
s.push(v);
}
}
}
}
int main() {
int n, m, s;
cin >> n >> m >> s;
for(int i = 1; i <= m; i++) {
int u, v;
cin >> u >> v;
add(u, v);
add(v, u);
}
dfs(s);
for(int i = 1; i <= n; i++)
if(vis[i])
cout << i << " ";
return 0;
}
```
以上就是我在实验中实现图的深度优先遍历算法的过程和代码,希望对你有所帮助。
阅读全文