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

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

     

目录

基本要求:

图的结构体:

图的构造:

图的深度优先(DFS):

图的打印输出:

完整代码:

测试数据:

 运行结果:

     通过给出的图的顶点和边的信息,构建无向图的邻接矩阵存储结构。在此基础上,从A顶点开始,对无向图进行深度优先遍历,输出遍历序列。

基本要求:

(1)从测试数据读入顶点和边信息,建立无向图邻接矩阵存储结构;

(2)把构建好的矩阵输入显示;

(3)从A顶点开始,编写DFS深度优先遍历算法;

(4)输出深度优先遍历序列。

图的结构体:

typedef char Vertextype;//顶点数据类型
typedef int Arctype;//边权值类型
typedef struct
{
	Vertextype vexs[mvnum];//顶点表
	Arctype arcs[mvnum][mvnum];//邻接矩阵
	int vexnum, arcnum;//当前图的点数和边数
}AMGraph;

图的构造:

bool Creategraph(AMGraph& G)
{
	cin >> G.vexnum >> G.arcnum;//输入总顶点数,总边数
	for (int i = 0; i < G.vexnum; i++)
	{
		cin >> G.vexs[i];//依次输入点的信息
		mp[G.vexs[i]]=0;//辅助数组,是否访问过该点,0表示没访问过
	}
	for (int i = 0; i < G.vexnum; i++)//初始化邻接矩阵
		for (int j = 0; j < G.vexnum; j++)
			G.arcs[i][j] = 0;
	for (int k = 0; k < G.arcnum; k++)//构造邻接矩阵
	{
		Vertextype v1, v2;
		int w;
		cin >> v1 >> v2;//输入一条边的顶点及边的权值
		int i = Locatevex(G, v1);
		int j = Locatevex(G, v2);//确定v1和v2在G中的位置
		G.arcs[i][j] = 1;//边<v1,v2>的权值置为w
		G.arcs[j][i] = G.arcs[i][j];//无向图是对称图
	}
	return 1;
}

图的深度优先(DFS):

void DFS(AMGraph& G,Vertextype v)
{
	cout << v<<" ";
	mp[v] = 1;
	for (int i = 0; i < G.vexnum; i++)
	{
		int a = Locatevex(G, v);
		if (v == G.vexs[i])
			continue;
		else
		{
			if (G.arcs[a][i] == 1 && !mp[G.vexs[i]])//是邻边且没访问过
				DFS(G, G.vexs[i]);
		}
	}
}

图的打印输出:

void Print(AMGraph G)
{
	cout << "邻接矩阵:" << endl;
	for (int i = 0; i < G.vexnum; i++)
	{
		for (int j = 0; j < G.vexnum; j++)
			cout << G.arcs[i][j] << " ";
		cout << endl;
	}
}

完整代码:

#include<iostream>//无向图邻接矩阵
#include<map>
#define mvnum 100
using namespace std;
typedef char Vertextype;//顶点数据类型
typedef int Arctype;//边权值类型
map<Vertextype, int> mp;
typedef struct
{
	Vertextype vexs[mvnum];//顶点表
	Arctype arcs[mvnum][mvnum];//邻接矩阵
	int vexnum, arcnum;//当前图的点数和边数
}AMGraph;
int Locatevex(AMGraph G, Vertextype u)//在G图中查找顶点u,存在则返回顶点表中的下标,否则返回-1
{
	for (int i = 0; i < G.vexnum; i++)
		if (u == G.vexs[i]) return i;
	return -1;
}
bool Creategraph(AMGraph& G)
{
	cin >> G.vexnum >> G.arcnum;//输入总顶点数,总边数
	for (int i = 0; i < G.vexnum; i++)
	{
		cin >> G.vexs[i];//依次输入点的信息
		mp[G.vexs[i]]=0;//辅助数组,是否访问过该点,0表示没访问过
	}
	for (int i = 0; i < G.vexnum; i++)//初始化邻接矩阵
		for (int j = 0; j < G.vexnum; j++)
			G.arcs[i][j] = 0;
	for (int k = 0; k < G.arcnum; k++)//构造邻接矩阵
	{
		Vertextype v1, v2;
		int w;
		cin >> v1 >> v2;//输入一条边的顶点及边的权值
		int i = Locatevex(G, v1);
		int j = Locatevex(G, v2);//确定v1和v2在G中的位置
		G.arcs[i][j] = 1;//边<v1,v2>的权值置为w
		G.arcs[j][i] = G.arcs[i][j];//无向图是对称图
	}
	return 1;
}
void DFS(AMGraph& G,Vertextype v)
{
	cout << v<<" ";
	mp[v] = 1;
	for (int i = 0; i < G.vexnum; i++)
	{
		int a = Locatevex(G, v);
		if (v == G.vexs[i])
			continue;
		else
		{
			if (G.arcs[a][i] == 1 && !mp[G.vexs[i]])//是邻边且没访问过
				DFS(G, G.vexs[i]);
		}
	}
}
void Print(AMGraph G)
{
	cout << "邻接矩阵:" << endl;
	for (int i = 0; i < G.vexnum; i++)
	{
		for (int j = 0; j < G.vexnum; j++)
			cout << G.arcs[i][j] << " ";
		cout << endl;
	}
}
int main()
{
	AMGraph G;
	Creategraph(G);
	Print(G);
	cout << "DFS序列:";
	DFS(G, 'A');//从A开始遍历
}

测试数据:

12 16

A B C D E F G H I J K L

A D

B C

B D

B F

C F

D G

E B

E F

E G

E H

F I

G K

H I

I K

J K

K L

测试数据说明:

1.第一行两个整数分别表示无向图中的顶点数m和边数n;

2.第二行中的m个整数,表示m个顶点数据元素(数据类型为字符型;

3.从第三行开始连续n行数据,每一行两个字符表示无向图中的一条边关联的两个顶点数据信息。

4.无向图如下图示:

邻接矩阵储存图的深度优先遍历,深度优先,c++,算法

 运行结果:

邻接矩阵储存图的深度优先遍历,深度优先,c++,算法文章来源地址https://www.toymoban.com/news/detail-771840.html

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

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

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

相关文章

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

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

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

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

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

        深度优先遍历也称为深度优先搜索,简称为DFS。     深度优先遍历的思路是从图中某个顶点V出发,访问此顶点,然后从V的未被访问过的邻接点出发深度优先遍历图,直到图中所有与V路径相通的顶点都被访问到     该遍历过程用到递归。     深度优先遍历用到了一个辅

    2024年02月08日
    浏览(43)
  • 图的数据结构,系统学习图的基本概念、定义和建立,学会邻接矩阵、邻接表以及实现六度空间案例,遍历图的方式——广度、深度访问

    图 :G = (V,E) Graph = (Vertex, Edge) V:顶点(数据元素)的有穷非空集合; E:边的有穷集合。 有向图 :每条边都是有方向的     无向图 :每条边都是无方向的   完全图 :任意两点之间都有一条边相连    无向完全图:n个顶点,n(n-1)/2条边 无向完全图:n个顶点,n(n-1)条边 稀疏

    2023年04月22日
    浏览(45)
  • C++实现图—邻接矩阵,邻接表,深度遍历,广度遍历

    目录 1.图的基本概念 2.图的存储结构 2.1邻接矩阵 2.2 邻接表 3.图的遍历 3.1广度优先遍历 3.2图的深度遍历  总结: 图是由顶点集合以及顶点之间的关系组成的一种数据结构:G = (V,E),其中顶点集合V={x|x属于某个对象集}是有穷非空集合; E = {(x,y)|x,y属于V}或者E = {x, y|x,y属于V Pa

    2024年02月06日
    浏览(52)
  • 邻接矩阵存储图并深度优先搜索遍历

    采用邻接矩阵形式存储图,对图进行优先深度搜索,并输出结果。  算法设计       用邻接矩阵存储图首先定义图的邻接矩阵存储结构,其中一维数组vertexs用来表示与顶点有关的信息,二维数组arcs用来表示图中顶点之间的关系。      之后要初始化邻接矩阵,初始化顶点个

    2024年02月06日
    浏览(47)
  • 【数据结构】图的创建(邻接矩阵,邻接表)以及深度广度遍历(BFS,DFS)

    图是由顶点集合及顶点间的关系组成的一种数据结构:G = (V, E),其中: 顶点集合V = {x|x属于某个数据对象集}是有穷非空集合; E = {(x,y)|x,y属于V}或者E = {x, y|x,y属于V Path(x, y)}是顶点间关系的有穷集合,也叫 做边的集合。 完全图:在有n个顶点的无向图中,若有n * (n-1)/2条边,

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

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

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

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

    2024年02月06日
    浏览(61)
  • 蛮力算法之深度优先遍历和广度优先遍历——图的深度优先遍历和广度优先遍历,附带案例:迷宫问题及矩阵中传染性传播问题

    这两种搜索方法本质上都是基于蛮力法思路 这两种搜索方法对有向图和无向图都适用 1.1 邻接矩阵 邻接矩阵示意图: 1.2 邻接表 注意:边结点代表的是图中的边,而并非图中的结点;头结点才表示图中的结点;头结点身后所连接的为边结点 邻接表示意图:(一般默认为出边

    2024年02月05日
    浏览(64)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包