【算法导论】有向图的深度优先搜索遍历

        在前面的文章中,我已经讨论了无向图的遍历,现在发现在有向图中,可能会发生无法遍历到所有节点的情况。因此在经历一次深度优先搜索遍历后,如果还存在未被搜索到的节点,则需要再从新的节点开始进行深度优先搜索遍历,直到访问完所有节点。

以下面的有向图为例:

        如果从a开始进行深度优先搜索遍历,则会得到  a b c d h g f 后结束,因此我们还要 从未访问到的节点e进行第二次深度优先搜索遍历得到e.在前面的深度优先搜索的基础上,有向图的深度优先搜索程序实现如下:

#include<stdio.h>
#include<stdlib.h>
#define N 8 //顶点数

typedef struct node
{
	char vexs[N];//顶点数组
	int color[N];
	int arcs[N][N];//邻接矩阵
//	struct node *p;
}graph;

void DFS_direction(graph g,int i,int visited[N])
{
	printf("%c\n",g.vexs[i]);
	visited[i]=1;
	for(int j=0;j<N;j++)
		if(g.arcs[i][j]==1&&visited[j]==0)
			DFS_direction(g,j,visited);
}

void main()
{
	graph g;
	int v=0;
	int visited[N]={0};
	int visited1[N]={0};
	char vertex[N]={'A','B','C','D','E','F','G','H'};
	int matrix[N][N]={{0,1,0,0,0,0,0,0},
					  {0,0,1,0,0,1,0,0},
					  {0,0,0,1,0,0,1,0},
					  {0,0,1,0,0,0,0,1},
					  {1,0,0,0,0,1,0,0},
					  {0,0,0,0,0,0,1,0},
					  {0,0,0,0,0,1,0,1},
					  {0,0,0,0,0,0,0,1}};
	for(int i=0;i<N;i++)
	{
		g.vexs[i]=vertex[i];
		for(int j=0;j<N;j++)
			g.arcs[i][j]=matrix[i][j];
	}
	//printf("%d",g.arcs[7][5]);
	int d[N]={0};
	int f[N]={0};
	int num=0;
	//printf("图按照邻接矩阵存储时的深度优先搜索遍历:\n");
	while(num!=N)//当从某个节点无法一次搜索完所有节点时,从一个没有被访问过的节点开始
	{
		for(int j=0;j<N;j++)
			if(visited[j]==0)
				DFS_direction(g,j,visited);

		for(int k=0;k<N;k++)
			num=num+visited[k];//查看是否所有节点遍历到	

	}

}

注:如果程序出错,可能是使用的开发平台版本不同,请点击如下链接: 解释说明

原文:http://blog.csdn.net/tengweitw/article/details/17336271

作者:nineheadedbird

时间: 2024-09-17 04:35:54

【算法导论】有向图的深度优先搜索遍历的相关文章

【算法导论】图的深度优先搜索遍历(DFS)

        关于图的存储在上一篇文章中已经讲述,在这里不在赘述.下面我们介绍图的深度优先搜索遍历(DFS).         深度优先搜索遍历实在访问了顶点vi后,访问vi的一个邻接点vj:访问vj之后,又访问vj的一个邻接点,依次类推,尽可能向纵深方向搜索,所以称为深度优先搜索遍历.显然这种搜索方法具有递归的性质.图的BFS和树的搜索遍历很类似,只是其存储方式不同.         其基本思想为:从图中某一顶点vi出发,访问此顶点,并进行标记,然后依次搜索vi的每个邻接点vj:若vj未被访

人工智能: 自动寻路算法实现(二、深度优先搜索)

前言 本篇文章是机器人自动寻路算法实现的第二章.我们要讨论的是一个在一个M×N的格子的房间中,有若干格子里有灰尘,有若干格子里有障碍物,而我们的扫地机器人则是要在不经过障碍物格子的前提下清理掉房间内的灰尘.具体的问题情景请查看人工智能: 自动寻路算法实现(一.广度优先搜索)这篇文章,即我们这个系列的第一篇文章.在上一篇文章里,我们介绍了通过广度优先搜索算法来实现扫地机器人自动寻路的功能.在这篇文章中,我们要介绍与之相对应的另一种算法:深度优先搜索算法. 项目下载地址 正文 算法介绍 深度优先算法

【算法导论】二叉树的广度优先遍历

二叉树的广度优先遍历 广度优先遍历:又称按层次遍历,也就是先遍历二叉树的第一层节点,然后遍历第二层节点--最后遍历最下层节点.而对每一层的遍历是按照从左至右的方式进行的. 基本思想:按照广度优先遍历的方式,上一层中先被访问的节点,它的下层孩子也必然先被访问,因此在算法实现时,需要使用一个队列.在遍历进行之前先把二叉树的根结点的存储地址入队,然后依次从队列中出队结点的存储地址,每出队一个结点的存储地址则对该结点进行访问,然后依次将该结点的左孩子和右孩子的存储地址入队,如此反复,直到队空为止. 具体

图的遍历之深度优先搜索和广度优先搜索

深度优先搜索的图文介绍 1. 深度优先搜索介绍 图的深度优先搜索(Depth First Search),和树的先序遍历比较类似. 它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到.  若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止. 显然,深度优先搜索是一个递归的过程. 2. 深度优先搜索图解 2.

人工智能: 自动寻路算法实现(一、广度优先搜索)

前言 随着人工智能技术的日益发达,我们的生活中也出现了越来越多的智能产品.我们今天要关注的是智能家居中的一员:扫地机器人.智能扫地机器人可以在主人不在家的情况下自动检测到地面上的灰尘,并且进行清扫.有些更为对路线进行规划,找到可以清理灰尘的最短路径,达到省电的效果.当然,绕过障碍物也是必须拥有的技能.我们今天就来看一下扫地机器人自动寻路的算法的简单实现.这里我们不对机器人如何识别出灰尘进行讨论,我们只讨论发现了灰尘之后,机器人的路径规划进行一个分析.为了简单起见,我们假设机器人所处在的是一个M×

深度优先搜索的图文介绍

1. 深度优先搜索介绍 图的深度优先搜索(Depth First Search),和树的先序遍历比较类似. 它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到. 若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止. 显然,深度优先搜索是一个递归的过程. 2. 深度优先搜索图解 2.1 无向图的深度优先搜索

C++中如何深度搜索遍历文件夹

深度优先搜索遍历文件夹所有文件, 由于使用windows的函数, 必须要使用C语言; 注意字符集的问题,使用"#undef UNICODE", 屏蔽因字符集所产生的问题; 使用vector<string>存储所有文件名, 因为要递归使用, 所以需要设置为静态,返回shared_ptr的指针 代码如下: /************************************************* File: main.cpp Copyright: C.L.Wang A

【算法导论】图的广度优先搜索遍历(BFS)

       图的存储方法:邻接矩阵.邻接表        例如:有一个图如下所示(该图也作为程序的实例): 则上图用邻接矩阵可以表示为: 用邻接表可以表示如下: 邻接矩阵可以很容易的用二维数组表示,下面主要看看怎样构成邻接表:         邻接表存储方法是一种顺序存储与链式存储相结合的存储方法.在这种方法中,只考虑非零元素,所以在图中的顶点很多而边很少时,可以节省存储空间.         邻接表存储结构由两部分组成:对于每个顶点vi, 使用一个具有两个域的结构体数组来存储,这个数组称为顶

C语言实现图的遍历之深度优先搜索实例_C 语言

DFS(Depth-First-Search)深度优先搜索算法是图的遍历算法中非常常见的一类算法.分享给大家供大家参考.具体方法如下: #include <iostream> #include <algorithm> #include <iterator> using namespace std; #define MAX_VERTEX_NUM 10 struct Node { int adjvex; struct Node *next; int info; }; typ