深度优先遍历(邻接矩阵,邻接表)

这篇具有很好参考价值的文章主要介绍了深度优先遍历(邻接矩阵,邻接表)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

    深度优先遍历也称为深度优先搜索,简称为DFS。

    深度优先遍历的思路是从图中某个顶点V出发,访问此顶点,然后从V的未被访问过的邻接点出发深度优先遍历图,直到图中所有与V路径相通的顶点都被访问到

    该遍历过程用到递归。

    深度优先遍历用到了一个辅助数组Graph_sign【】,该数组的下标与顶点数组的下标对应,即当Graph_sign【1】中储存的标记为true就表示顶点数组vexs【1】中储存的顶点已被遍历到

代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
typedef char VertexType;//顶点类型
typedef int EdgeType;//边上的权值类型
#define MAXVEX 20//最大顶点数(开辟储存顶点的一维数组的空间大小)
#define INFINITY 10000//用10000来代表无穷(在储存边的二维数组中,对没有该边存在的表格,权值设为无穷)
//定义图的结构体(图由储存顶点的一维数组和储存边的二维数组,以及记录图中结点数和边数的int类型的变量组成)
struct MGraph
{
	VertexType vexs[MAXVEX];//储存顶点的一维数组
	EdgeType arc[MAXVEX][MAXVEX];//储存边的二维数组
	int Num_vex, Num_arc;//图中的顶点数和边数
};

//无向网图的创建
void Create_MGraph(MGraph& G)
{
	int m, n;
	cout << "请输入图的顶点数和边数" << endl;
	cin >> G.Num_vex >> G.Num_arc;
	cout << "请依次输入图的顶点:" << endl;
	for (int i = 0; i < G.Num_vex; i++)
	{
		cin >> G.vexs[i];
	}
	//初始化储存边的二维数组
	for (int i = 0; i < G.Num_vex; i++)
		for (int j = 0; j < G.Num_vex; j++)
		{
			G.arc[i][j] = INFINITY;
		}
	//向二维数组中输入对应边的权值
	for (int k = 0; k < G.Num_arc; k++)
	{
		cout << "请依次输入边(Vm,Vn)的下标m,n" << endl;
		cin >> m >> n;
		cout << "请输入边(" << G.vexs[m-1] << "," << G.vexs[n - 1] << ")的权值" << endl;
		cin >> G.arc[m - 1][n - 1];
		//由于是无向网图,所以存在边(m,n),就存在边(n,m)所以我们还应该向二维数组的(n,m)位置输入权值
		G.arc[n - 1][m - 1] = G.arc[m - 1][n - 1];
	}
}

//深度优先遍历输出所有顶点
//记录顶点是否被遍历过的标志数组
bool Graph_sign[MAXVEX];
//邻接矩阵的深度优先算法
void DFS(MGraph& G,int i)//i是作为第一个遍历的顶点的下标
{
	cout << G.vexs[i] << " ";
	//下标为i的顶点已经遍历到改变标志
	Graph_sign[i] = true;
	//遍历其余顶点,判断由顶点i能到达的下一个顶点
	for (int j = 0; j < G.Num_vex; j++)
	{
		if (G.arc[i][j] != INFINITY && !Graph_sign[j])
		{
			DFS(G, j);
		}
	}
}

//邻接矩阵的深度遍历操作
void DFS_MGraph(MGraph& G)
{
	//初始化标志数组
	for (int i = 0; i < G.Num_vex; i++)
	{
		Graph_sign[i] = false;
	}
	//图不连通的情况要有多个顶点作为第一个遍历的顶点
	for (int j = 0; j < G.Num_vex; j++)
	{
		if (!Graph_sign[j])
			DFS(G, j);
	}
}


int main()
{
	MGraph G;
	Create_MGraph(G);
	DFS_MGraph(G);
	system("pause");
	return 0;
}

        邻接表和邻接矩阵大同小异:

代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
#define MAXSIZE 20
//顶点类型
typedef char VetexType;
//权值类型
typedef int InfoType;
//边表结点
struct EdgeNode
{
	//邻结点域储存顶点的下标
	int adjvex;
	//权值
	InfoType m_info;
	//指向下一个边表结点的指针
	EdgeNode* next;
};

//顶点表结点
struct VertexNode
{
	//顶点
	VetexType vetex;
	//指向边表的头指针
	EdgeNode* FirstEdge;
};

//邻接表
struct GraphAdiList
{
	//顶点数组
	VertexNode Adjext[MAXSIZE];
	//顶点个数,边条数
	int numVertex, numEdges;
};

//创建邻接表
void CreaterADGraph(GraphAdiList& G)
{
	int m, n, info;
	cout << "请输入顶点个数和边条数" << endl;
	cin >> G.numVertex >> G.numEdges;
	//初始化顶点表
	for (int i = 0; i < G.numVertex; i++)
	{
		cout << "请输入第" << i + 1 << "个顶点" << endl;
		//初始化顶点表中的两个属性
		cin >> G.Adjext[i].vetex;
		G.Adjext[i].FirstEdge = NULL;
	}
	//创建边表
	for (int k = 0; k < G.numEdges; k++)
	{
		EdgeNode* p;
		p = new EdgeNode;
		cout << "请输入边(vm,vn)上的顶点序号(m,n)和权值" << endl;
		cin >> m >> n >> info;
		//初始化创建的边表结点p
		p->adjvex = n - 1;
		p->m_info = info;
		//将边表结点p按头插法插入邻接表
		p->next = G.Adjext[m - 1].FirstEdge;
		G.Adjext[m - 1].FirstEdge = p;
		//由于该图是无向图所以还要考虑(n,m)的情况
		p = new EdgeNode;
		p->adjvex = m - 1;
		p->m_info = info;
		p->next = G.Adjext[n - 1].FirstEdge;
		G.Adjext[n - 1].FirstEdge = p;
	}
	cout << "邻接表创建完成" << endl;
}

//深度优先遍历输出所有顶点
//邻接表的深度优先遍历算法
bool Graph_sign[MAXSIZE];//标志数组,用来判断顶点是否被遍历过,被遍历过的为true,否则为false
void DFS(GraphAdiList& G, int i)//i是顶点在顶点表中的下标
{

	//说明下标为i的顶点已经被遍历
	Graph_sign[i] = true;
	cout << G.Adjext[i].vetex;
	EdgeNode* p;
	p = G.Adjext[i].FirstEdge;
	if (!Graph_sign[p->adjvex])
	{
		DFS(G, p->adjvex);
	}
}

//邻接表的深度遍历操作
void ADGraph(GraphAdiList& G)
{
	//初始化标志数组
	for (int i = 0; i < G.numVertex; i++)
	{
		Graph_sign[i] = false;
	}
	//找到未被遍历到的顶点作为第一个遍历的顶点进行遍历(要是图是全部连通的就只会遍历一次)
	for (int j = 0; j < G.numVertex; j++)
	{
		if (!Graph_sign[j])
		{
			DFS(G, j);
		}
	}
}

int main()
{
	GraphAdiList G;
	CreaterADGraph(G);
	ADGraph(G);
}

    以上两个代码都是完整的可调式的程序,相应的关于邻接矩阵和邻接表的创建可以看这里:

邻接表创建,邻结矩阵的创建。

    深度优先遍历的流程图如下:

深度优先遍历(邻接矩阵,邻接表)

 

  ps:以上图来自于大话数据结构

    我们注意到在深度遍历操作中我们还要利用for循环遍历所有顶点,再将其传入深度优先遍历算法DFS中,其实我们的深度优先遍历算法DFS只要传入一个顶点就已经可以遍历完一个连通图了,那为什么我们还要遍历所有顶点判断出没有遍历到的顶点再调用DFS函数呢:-------因为我们的图不一定是连通的,要是图不连通的话就会分为几个连通的部分,而深度优先遍历算法DFS只会遍历出与传入的首个顶点连通的所有顶点,而未与首个顶点连通的顶点是遍历不出来的。所以要再对所有顶点进行遍历,找出其他连通部分的顶点作为该连通部分的首个顶点,传入到DFS算法中

    (若图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作起始点,重复DFS算法直到图中所有顶点都被访问到为止

    文章来源地址https://www.toymoban.com/news/detail-473333.html

到了这里,关于深度优先遍历(邻接矩阵,邻接表)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 邻接矩阵储存图实现深度优先遍历(C++)

          目录 基本要求: 图的结构体: 图的构造: 图的深度优先(DFS): 图的打印输出: 完整代码: 测试数据:  运行结果:      通过给出的图的顶点和边的信息,构建无向图的邻接矩阵存储结构。在此基础上,从A顶点开始,对无向图进行深度优先遍历,输出遍历序列

    2024年02月03日
    浏览(31)
  • 6-1 邻接矩阵存储图的深度优先遍历

    分数 20 作者 DS课程组 单位 浙江大学 试实现邻接矩阵存储图的深度优先遍历。 其中MGraph是邻接矩阵存储的图,定义如下: 函数DFS应从第V个顶点出发递归地深度优先遍历图Graph,遍历时用裁判定义的函数Visit访问每个顶点。当访问邻接点时,要求按序号递增的顺序。题目保证

    2024年02月05日
    浏览(26)
  • 利用邻接矩阵进行的深度优先和广度优先遍历(含全部代码+图解)

    目录     --------------------------------------目录------------------------------------------ 图的定义和术语 图的邻接矩阵构建法   深度优先遍历算法(DFS)   广度优先遍历算法 (BFS) 全部代码          图 :G = (V,E) V:顶点的有穷非空集合 E:边的有穷集合          无向图 :每条

    2024年02月05日
    浏览(27)
  • 数据结构实验6 :图的存储与遍历(邻接矩阵的深度优先遍历DFS和邻接表的广度优先遍历BFS)

    利用邻接矩阵存储无向图,并从0号顶点开始进行深度优先遍历。 输入第一行是两个整数n1 n2,其中n1表示顶点数(则顶点编号为0至n1-1),n2表示图中的边数。 之后有n2行输入,每行输入表示一条边,格式是“顶点1 顶点2”,把边插入图中。 例如: 4 4 0 1 1 3 0 3 0 2 先输出存储

    2024年02月09日
    浏览(54)
  • 基于邻接矩阵的有向图的广度优先遍历(BFS)和深度优先遍历(DFS)算法

    概念: 广度优先遍历算法是图的另一种基本遍历算法,其基本思想是尽最大程度辐射能够覆盖的节点,并对其进行访问。 以迷宫为例,广度优先搜索则可以想象成一组人一起朝不同的方向走迷宫,当出现新的未走过的路的时候,可以理解成一个人有分身术,继续从不同的方

    2024年02月06日
    浏览(49)
  • [数据结构]:25-图深度优先遍历(邻接矩阵)(C语言实现)

    目录 前言 已完成内容 图深度优先遍历实现 01-开发环境 02-文件布局 03-代码 01-主函数 02-头文件 03-AdjMatrixFunction.cpp 04-DFS.cpp 结语         此专栏包含408考研数据结构全部内容,除其中使用到C++引用外,全为C语言代码。使用C++引用主要是为了简化指针的使用,避免二重指针的

    2023年04月10日
    浏览(37)
  • 对无向图进行邻接矩阵的转化,并且利用DFS(深度优先)和BFS(广度优先)算法进行遍历输出, 在邻接矩阵存储结构上,完成最小生成树的操作。

    目录 一 实验目的 二 实验内容及要求 实验内容: 实验要求: 三 实验过程及运行结果 一 算法设计思路 二 源程序代码 三、截图 四 调试情况、设计技巧及体会 1.掌握图的相关概念。 2.掌握用邻接矩阵和邻接表的方法描述图的存储结构。 3.掌握图的深度优先搜索和广度优

    2024年02月04日
    浏览(44)
  • 广度优先遍历(邻接表,邻接矩阵)

        广度优先遍历又称为广度优先搜索,简称BFS     如果说图的深度优先遍历(图的深度优先遍历相关内容:图的深度优先遍历)类似树的前序遍历,那么图的广度优先遍历就类似于树的层序遍历。     具体遍历过程如下图所示:     就如上面的第三个图上所编写的序号进

    2024年02月10日
    浏览(32)
  • 邻接表按深度优先遍历和按广度优先遍历的序列

    求此邻接表的深度优先遍历序列和广度优先遍历序列。   深度优先:按深度优先遍历时会有类似\\\"跳转\\\"的操作,比如例1中顶点v1→边v2后,会直接跳转到顶点v2去,再重新从顶点v2→边v1,由于v1访问过,所以变为v2→边v5,再跳转到顶点v5去,直到每个顶点都被访问过。抽象理解

    2024年02月04日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包