1.深度优先遍历无向图
无向图是图论中的一个基本概念,其中任意两个顶点之间都存在一条无向边。深度优先遍历(Depth-First Search, DFS)是一种用于遍历或搜索无向图的算法。DFS从图的某一顶点出发,访问尽可能深的分支,直到该分支的所有顶点都被访问过,然后回溯到上一个顶点,继续搜索下一个分支。这种遍历方式在图的连通性判断、寻找环、拓扑排序等问题中有着广泛的应用。
2.深度优先遍历的基本原理
深度优先遍历是一种递归的遍历算法。在遍历过程中,我们使用一个标记数组来记录每个顶点的访问状态。当访问一个顶点时,我们将其标记为已访问,并递归地访问它的所有未访问过的相邻顶点。当所有相邻顶点都被访问过后,我们回溯到上一个顶点,继续搜索其他未访问过的分支。
3.深度优先遍历无向图的步骤
-
初始化:
- 创建一个无向图,表示顶点和边的关系。
- 初始化一个标记数组,用于记录每个顶点的访问状态。所有顶点初始时都标记为未访问。
- 选择一个起始顶点作为遍历的起点。
-
开始遍历:
- 调用深度优先遍历函数,传入起始顶点作为参数。
-
深度优先遍历函数:
- 检查当前顶点是否已访问过。如果是,则直接返回。
- 标记当前顶点为已访问。
- 遍历当前顶点的所有相邻顶点。对于每个未访问过的相邻顶点,递归调用深度优先遍历函数。
- 遍历完成后,返回上一层递归。
-
输出结果:
- 当所有顶点都被访问过后,遍历结束。可以根据需要输出遍历的顺序或其他相关信息。
4.深度优先遍历无向图的实现
#include<iostream>
#define MAX 100
using namespace std;
int book[MAX+1],n,sum=0,e[MAX+1][MAX+1];
void dfs(int cur){
cout<<cur<<" ";
sum++;
if (sum==n)return;
for (int i = 0; i <=n; i++)
{
if (e[cur][i]==1&&book[i]==0)
{
book[i] = 1;
dfs(i);
}
}
return;
}
int main(){
int m;
cin>>n>>m;//元素个数和边数
for (int i = 1; i <=n; i++)
for (int j = 1; i <=n; i++)
{
if(i==j)e[i][j]=0;
else e[i][j]=9;
}
int a,b;
for (int i = 1; i <=m; i++){
cin>>a>>b;
e[a][b] = 1;
e[b][a] = 1;
}
book[1]=1;
dfs(1);
return 0;
}
/* 5 5
1 2
1 3
1 5
2 4
3 5 */
相似写法
#include<iostream>
#define MAX 101
using namespace std;
int main(){
int n,m,e[MAX][MAX],que[MAX],book[MAX],cur;
cin>>n>>m;//元素个数和边数
for (int i = 1; i <=n; i++)
for (int j = 1; j <=n; j++)
{
if(i==j)e[i][j]=0;
else e[i][j]=9;
}
int a,b;
for (int i = 1; i <=m; i++){
cin>>a>>b;
e[a][b] = 1;
e[b][a] = 1;
}
//queue
int head=1,tail=1;
que[1]=1;
tail++;
book[1]=1;
while (head<tail&&tail<=n)
{
cur=que[head];
for (int i = 1; i <=n; i++)
{
if(e[cur][i]==1&&book[i]==0)
{
book[i]=1;
que[tail]=i;
tail++;
}
}
if(tail>n)break;
head++;
}
for (int i = 1; i < tail; i++)
{
cout<<que[i]<<" ";
}
return 0;
}