深度优先搜索的一般步骤:
1)从顶点V出发,访问v。
2)找出刚才访问过的顶点的第一个未被访问的邻接点,访问该顶点。以该顶点为新顶点,重复此步骤,直到刚访问的顶点没有没有未被访问过的邻接点为止。
3)返回前一个访问过的仍有未被访问过的邻接点的顶点,找出该顶点的下一个未被访问过的邻接点,访问该顶点。
4)重复2)3)步骤,直到所有点都被访问过。搜索结束。
(图的存储一般都采用邻接矩阵,实际上就是二维数组,以a[i][j]的值来判断i和j之间有没有弧)
#include<iostream>
#include<cstring>
using namespace std;
int a[11][11];
bool visited[11];
void store_graph() //邻接矩阵存储图
{
int i,j;
for(i=1;i<=10;i++)
for(j=1;j<=10;j++)
cin>>a[i][j];
}
void dfs_graph() //深度遍历图
{
void dfs(int v); //函数调用声明
memset(visited,false,sizeof(visited)); //初始化,都没被访问过
for(int i=1;i<=10;i++) //遍历每个顶点是为了防止图不连通时无法访问每个顶点
if(visited[i]==false)
dfs(i);
}
void dfs(int v) //深度遍历顶点
{
int Adj(int x); //函数调用声明
cout<<v<<" "; //访问顶点v
visited[v]=true;
int adj=Adj(v);
while(adj!=0)
{
if(visited[adj]==false)
dfs(adj); // 递归遍历邻接点,直到没有邻接点后停止
adj=Adj(v); // 返回上一个被访问的有未被访问过的邻接点的顶点
}
}
int Adj(int x) //求邻接点
{
for(int i=1;i<=10;i++)
if(a[x][i]==1 /*如果两个顶点之间有弧*/&& visited[i]==false) //x和i分别代表两个结点
return i; //寻找没有被访问过的 邻接点
return 0; //没有邻接点会返回0
}
int main()
{
cout<<"初始化图:"<<endl;
store_graph();
cout<<"dfs遍历结果:"<<endl;
dfs_graph();
return 0;
}
深度优先搜索一般用于 求连通块个数,拓扑排序。