图的深度优先遍历c++
时间: 2023-11-20 21:54:08 浏览: 98
图的深度优先遍历(Depth First Search,DFS)是一种常用的图遍历算法,它可以用于查找连通性、寻找路径等问题。下面是C++实现的伪代码:
```
void DFS(int u) {
visited[u] = true; // 标记节点u为已访问
for (int v : adj[u]) { // 遍历节点u的所有邻居节点v
if (!visited[v]) { // 如果节点v未被访问过
DFS(v); // 递归访问节点v
}
}
}
```
其中,`visited`数组用于记录每个节点是否被访问过,`adj`数组用于存储每个节点的邻居节点列表。在实际代码中,可以使用栈来实现DFS的非递归版本。
相关问题
图的深度优先遍历c++代码
以下是图的深度优先遍历的C++代码示例:
```
#include<iostream>
#include<vector>
using namespace std;
const int N = 1e5+10; //最大点数
vector<int> g[N]; //邻接表存储图
bool vis[N]; //标记每个点是否访问过
//深度优先遍历
void dfs(int u){
vis[u] = true; //标记当前节点已经访问过
cout<<u<<" "; //输出当前节点
for(int i=0;i<g[u].size();i++){ //枚举当前节点的所有出边
int v = g[u][i]; //v为当前节点的一个邻居
if(!vis[v]){ //如果v未被访问过
dfs(v); //递归遍历v
}
}
}
int main(){
int n,m;
cin>>n>>m; //输入节点数和边数
for(int i=0;i<m;i++){
int u,v;
cin>>u>>v; //输入一条边的起点和终点
g[u].push_back(v); //存储邻接表
g[v].push_back(u); //如果无向图还需存储反向边
}
for(int i=1;i<=n;i++){ //从1号节点开始遍历
if(!vis[i]){ //如果i未被访问过
dfs(i); //从i开始深度优先遍历
}
}
return 0;
}
```
其中,g[i]表示以i为起点的所有边的终点集合,vis[i]表示第i个节点是否被访问过。在dfs函数中,首先将当前节点u标记为已访问,并输出节点u。然后枚举节点u的所有出边,如果该出边指向的节点v未被访问过,则递归遍历节点v。最后,在主函数中从第一个节点开始遍历,对未被访问过的节点进行深度优先遍历。
图的深度优先遍历c++
以下是图的深度优先遍历的C++代码示例:
```c++
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 100;
vector<int> G[MAXN]; //存储图
bool vis[MAXN]; //记录节点是否被访问过
void dfs(int u)
{
vis[u] = true;
cout<<u<<" "; //输出节点u
for(int i=0; i<G[u].size(); i++)
{
int v = G[u][i];
if(!vis[v]) //如果节点v没被访问过,就继续递归
dfs(v);
}
}
int main()
{
int n,m; //n为节点数,m为边数
cin>>n>>m;
for(int i=0; i<m; i++)
{
int u,v;
cin>>u>>v;
G[u].push_back(v);
G[v].push_back(u); //无向图需要双向存储
}
memset(vis, false, sizeof(vis));
for(int i=0; i<n; i++)
if(!vis[i])
dfs(i); //从未被访问过的节点开始dfs
return 0;
}
```
在这个示例中,我们使用邻接表来存储图,使用一个bool数组来记录每个节点是否被访问过。我们从未被访问过的节点开始进行dfs。在dfs中,我们首先标记当前节点为已访问,然后输出该节点,最后递归访问该节点的所有未被访问过的邻居节点。
阅读全文