邻接矩阵存储图并深度优先搜索遍历

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

采用邻接矩阵形式存储图,对图进行优先深度搜索,并输出结果。


 算法设计

      用邻接矩阵存储图首先定义图的邻接矩阵存储结构,其中一维数组vertexs用来表示与顶点有关的信息,二维数组arcs用来表示图中顶点之间的关系。

     之后要初始化邻接矩阵,初始化顶点个数以及边的个数,输入数据并且添加权值然后输出矩阵。

     深度优先搜索然后遍历,最后输出搜索遍历后的顺序。

     深度优先遍历类似于树的先根遍历,是树先根遍历的推广。深度优先遍历是个递归过程,所以这个算法可以用递归实现。从某个结点v出发,进行优先遍历图的算法采用递归的形式说明如下:(1)设置访问标识数组并初始化标识数组。

(2)若访问过顶点,则该标识设置为1,并输出当前顶点。

(3)若某个顶点没有被访问过,则继续进行遍历此顶点。

(4)继续找下一个邻接点,递归递归进行遍历,直到所有顶点都被访问。

设计的函数如下:

InitG()

初始化邻接矩阵

Init_Vertex()

初始化矩阵中的顶点个数

Init_Arc()

初始化矩阵中的边数

InSerG()

插入邻接矩阵中的数据

InWeight()

在矩阵中添加连接顶点之间的信息 ,即为图的权值

Print()

输出邻接矩阵

Init_DFS()

深度优先搜索函数

DFS()

深度优先遍历函数

main()

主函数用来测试该算法功能

源代码:

/************
date:2021-11-27
version:1.0
author:sy
Description:采用邻接矩阵存储图,进行图的深度优先搜索并输出结果 
**************/
#include<stdio.h>
#include<stdlib.h>
#define MAXNUM 100 
/* 邻接矩阵数据结构体 */
typedef struct {
	int vexnum,	arcnum;         //  图的顶点数和弧数 
	int vertexs[MAXNUM];       	//	存储顶点的一维数组 
	int arcs[MAXNUM][MAXNUM]; 	//	邻接矩阵
}graph,*Graph; 
typedef struct Arc{
	int v1;		    //	用来存放第一个顶点 
	int v2;	    	//	用来存放第二个顶点
	int weight;	    //	权值 
}*ArcType;
/* 初始化邻接矩阵 */ 
void InitG(Graph G,int Vertex)
{	
	G->arcnum = 0;			//	初始化为0条边 
	G->vexnum = Vertex;		//	初始化顶点数 
	int i,j;
	for(i=0;i<Vertex;i++)
	{
		for(j=0;j<Vertex;j++)
		{
			G->arcs[i][j] = 0;
		}
	} 
}
/* 初始化顶点个数 */
int Init_Vertex()
{
	int Vertex;
    printf("请输入顶点个数(回车键结束): ");
	scanf("%d",&Vertex);
	return Vertex;
}
/* 初始化边的数量 */ 
int Init_Arc()
{
	int arc;
	printf("请输入边的数量(回车键结束): ");
	scanf("%d",&arc);
	return arc;
} 
void InWeight(Graph G,ArcType T); 
/* 开始插入数据 */ 
void InSerG(Graph G,int edge,int V)
{
	int i,j;
	if(edge>0)         // 边数大于0的时候才插入数据 
	{
		printf("请输入顶点和权值(空格分隔,回车结束)\n");
		for(i=0;i<edge;i++)
		{		
			ArcType T;	// 分配内存,接受顶点v1,v2和权值	
			T = (ArcType)malloc(sizeof(struct Arc));	
			scanf("%d %d %d",&(T->v1),&(T->v2),&(T->weight));
			if(T->v1 ==T->v2)
			{
				printf("无向图邻接矩阵对角线为0,输入错误,结束运行\n");
				exit(-1); 
			}
			InWeight(G,T);
		}	
		printf("请输入要创建的顶点(空格隔开,回车结束): \n");
		for(j=0;j<V;j++)
		{
			scanf("%d",&(G->vertexs[j]));
		}
	}else printf("输入的边数错误"); 
} 
/* 在矩阵中添加连接顶点之间的信息 ,即为图的权值*/
void InWeight(Graph G,ArcType T)
{
	G->arcs[T->v1][T->v2] = T->weight;
	G->arcs[T->v2][T->v1] = T->weight; 
} 
/* 输出邻接矩阵 */
void Print(Graph p,int Vertex)
{
	int i,j;
	for(i=0;i<Vertex;i++)
	{
		for(j=0;j<Vertex;j++)
		{
			printf("%4d",p->arcs[i][j]);	//	打印邻接矩阵 
		}	
			putchar('\n');
	}
}

int visited[MAXNUM];             //访问标识数组 
void DFS (Graph G,int v,int V);  //声明函数 
/* 深度优先搜索 */
void Init_DFS (Graph G,int V)
{
	int i;
	for(i=0;i<V;i++)      /*初始化标识数组,全为0*/ 
	{
		visited[i] = 0;
	}
	for(i=0;i<V ;i++)	   // 检查每一个顶点是否被遍历到 
	{
		if(!visited[i])	
			DFS (G,i,V);   // 开始深度遍历	
	} 
	putchar('\n');
}
/*深度优先遍历*/
void DFS (Graph G,int v,int V)
{
	int i;
	visited[v] = 1;	 
	printf("%d ",G->vertexs[v]);	//	输出当前顶点 
	for(i=0;i<V ;i++)
	{
		if(!visited[i] && G->arcs[v][i] != 0) //	如果当前顶点的邻近点存在,且没有遍历过 
		{									  //	则继续递归遍历 
		    DFS ( G,i,V );	                  //	递归遍历当前顶点的邻近点 
		}	
	} 
}
int main()
{
	int Vernum;
	int arc;
	Graph P;		//	邻接矩阵头节点指针 					
	Vernum = Init_Vertex();     /*创建邻接矩阵*/
	arc = Init_Arc();
    P = (Graph)malloc(sizeof(graph));	//分配存储空间 
	P->vexnum = Vernum;	            	//	记录顶点个数 
	P->arcnum = arc;	            	//	记录边的个数 
	InitG(P,Vernum);                	//	初始化邻接矩阵 
	InSerG(P,arc,Vernum);	    //	插入数据  
	
	printf("无向图邻接矩阵如下:");	
	printf("\n---------\n\n");
    Print(P,Vernum);
	printf("\n---------\n");
		
	printf("深度优先搜索遍历邻接矩阵结果为:\n");
	Init_DFS (P,Vernum);
	return 0;	
} 

 

测试

 在这里输入顶点需要从0开始,因为数组下标是从[0][0]开始的。

构造一颗无向图如下:

 邻接矩阵存储图并深度优先搜索遍历

深度优先遍历搜索遍历的结果为:1 2 4 3 5

测试结果如下:

邻接矩阵存储图并深度优先搜索遍历文章来源地址https://www.toymoban.com/news/detail-460201.html

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

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

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

相关文章

  • 图用邻接矩阵实现,深度优先遍历和广度优先遍历

    邻接矩阵的结构体 邻接矩阵图的建立         图的建立有多种实现方式,我这里是从键盘输入顶点数,边条数,并从键盘输入边的关系 图是带有权值的,并且把环的权值赋值为0,两个顶点没有边权值为32767。 查找顶点v,并且返回v的相关信息         通过循环去找顶点,如

    2024年02月04日
    浏览(42)
  • C++构造无向图,邻接矩阵,深度优先遍历,广度优先遍历

    目录 定义无向图邻接矩阵 构造无向图 打印邻接矩阵 无向图邻接矩阵深度优先遍历(DFS) 无向图邻接矩阵广度优先遍历(BFS) 测试  完整代码 定义无向图邻接矩阵 构造无向图 1、输入总顶点数和总边数 2、依次输入顶点信息存入顶点表 3、 初始化邻接矩阵,使每个权值初始化

    2024年02月06日
    浏览(78)
  • 【数据结构与算法】图的基本概念 | 邻接矩阵和邻接表 | 广度优先遍历和深度优先遍历

    🌠 作者:@ 阿亮joy. 🎆 专栏:《数据结构与算法要啸着学》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 图是由顶点集合及顶点间的关系组成的一种数据结构:G = (V, E) ,其中: 顶点集合V = {x|x属于某

    2024年02月04日
    浏览(69)
  • 邻接矩阵储存图实现深度优先遍历(C++)

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

    2024年02月03日
    浏览(45)
  • 数据结构——图篇(邻接矩阵、邻接表、深度优先搜索、广度优先搜索)

    描述 图比树更为复杂,展现的是一种多对多的关系,图的结构是任意两个数据对象之间都可能存在某种特定的关系的数据结构 概念 顶点 : 基本介绍 顶点集合表示为V集合,要求图中顶点至少要有一个,即V集合不能为空集。通常使用|V|来表示顶点的个数,通常使用E(V)来表示

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

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

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

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

    2023年04月10日
    浏览(47)
  • 广度优先遍历(邻接表,邻接矩阵)

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

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

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

    2024年02月04日
    浏览(42)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包