图的深度遍历和广度遍历算法

图的广度遍历算法和图的深度遍历算法

深度优先遍历算法

1、深度优先遍历的递归定义

  假设给定图G的初态是所有顶点均未曾访问过。在G中任选一顶点v为初始出发点(源点),则深度优先遍历可定义如下:首先访问出发点v,并将其标记为已访问过;然后依次从v出发搜索v的每个邻接点w。若w未曾访问过,则以w为新的出发点继续进行深度优先遍历,直至图中所有和源点v有路径相通的顶点(亦称为从源点可达的顶点)均已被访问为止。若此时图中仍有未访问的顶点,则另选一个尚未访问的顶点作为新的源点重复上述过程,直至图中所有顶点均已被访问为止。

  图的深度优先遍历类似于树的前序遍历。采用的搜索方法的特点是尽可能先对纵深方向进行搜索。这种搜索方法称为深度优先搜索(Depth-First Search)。相应地,用此方法遍历图就很自然地称之为图的深度优先遍历

 

2.基本实现思想:

(1)访问顶点v;

(2)从v的未被访问的邻接点中选取一个顶点w,从w出发进行深度优先遍历;

(3)重复上述两步,直至图中所有和v有路径相通的顶点都被访问到。

3.代码实现:

    递归:

    

#include<iostream>
using namespace std;
#define N 10
int arr[N][N];
bool visited[N];
void init_graph()
{
	for (int i = 1;i < N;++i)
		for (int j = 1;j < N;++j)
			cin >> arr[i][j];
}

void dfs_graph()
{
	void dfs(int v);

	memset(visited,false,sizeof(visited));
	for (int i = 1;i < N;++i)      //遍历每个顶点是为了防止图不连通时无法访问每个顶点  
		if (visited[i] == false)
			dfs(i);
}

void dfs(int v)      //深度遍历顶点  
{
	int Adj(int x);

	cout << v << " ";
	visited[v] = true;
	int adj = Adj(v);
	while (adj != 0)
    {
		if(visited[v]==false)
		dfs(adj);            //递归调用是实现深度遍历的关键所在  
		adj = Adj(v);
    }
}

int  Adj(int x)    //求邻接点 且未访问的节点
{
	for (int i = 1;i < N;++i)
		if (arr[x][i] == 1 && visited[i] == false)
			return i;
	return 0;
}

int main()
{
	cout << "请输入矩阵:\n";
	init_graph();
	cout << "深度遍历结果:" << endl;
	dfs_graph();
	system("pause");
	return 0;
}

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/zcyzsy/article/details/73501264
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞