IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 邻接矩阵存储图并深度优先搜索遍历 -> 正文阅读

[数据结构与算法]邻接矩阵存储图并深度优先搜索遍历

作者:margin-left:.0001pt;text-align:justify;

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


?算法设计

? ? ? 用邻接矩阵存储图首先定义图的邻接矩阵存储结构,其中一维数组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

测试结果如下:

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-11-28 11:32:46  更:2021-11-28 11:34:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/9 15:42:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码