
从1开始dfs : 先将1标记为1,因为已经找过了,再找1的出边2,标记为1,dfs(2)
找2的出边3,将3标记为1,3找出边2,但是2被找过了(标记为1),所以不行,3没有其他出边,回溯,从新回到2
找2的出边4,4标记为1,4的出边2被找过了,且4没有其他出边,dfs结束
#include<bits/stdc++.h>
using namespace std;
vector <int> edge[10005]; //1万个顶点的dfs-容器邻接表
int n,m;
int vis[10005]; //每个点只能访问一次,要做标记
void dfs(int x){
if(vis[x]==1) return ; //x已经访问过了,dfs结束,出口
cout<<x<<" "; //打印 dfs 当前节点
vis[x] = 1; //访问过了,标记为 1
for(int i=0;i<edge[x].size();i++){
int y = edge[x][i]; //x的出边 y
if(vis[y]==0){ //y没有被访问过,也就是标记为 0
dfs(y); //继续找 y 的出边
}
}
}
int main()
{
int n,m,x,y; // n个顶点,m条边
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>x>>y; //x到 y有一条边
edge[x].push_back(y); //构建链接表
edge[y].push_back(x); //因为是无向图,所以都要 push
}
dfs(1); //从节点 1 开始 dfs
return 0;
}
本文描述了使用深度优先搜索(DFS)算法遍历无向图的过程,通过邻接表数据结构实现,从顶点1开始递归地标记并访问节点及其出边。
4026





