图的两种遍历实现

vector,list实现图的邻接表 DFS遍历 图的实现 图的实现有两种方法,一种是邻接矩阵,另一种是邻接表,这两种实现各有各的优缺点,以下给出了邻接表的实现并且DFS遍历的代码实现。 举例 // A simple representation of graph using STL #include<iostream> #include<vector> #include<list> using namesp... 阅读详情

老规矩,1.你必须明白,什么是图?

2.图是干什么的?

3.图的最基本的物理存储有哪些?

4.遍历图到底是在干什么?有哪些方式?

弄清楚这些,我这里介绍一种,图的邻接表存储方式实现的,完成初始化,输出,和两种遍历方式。上代码,自己看

#include<iostream>
#include<fstream>
#include"sq_Queue.h"
using namespace std;
template <class T1>
struct node{
	int num;
	T1 val;
	node *next;
};

template <class T1,class T2>
struct gpnode{
	T2 data;
	node<T1> *link;
};

template <class T1,class T2>
class Link_GP{
	private:
		int nn;
		gpnode<T1,T2> *gp;
	public:
		Link_GP(){gp=NULL;return;}
		void create_Link_GP(int,T2[]);
		void create_Link_GP(int ,T2[],char *);
		void prt_Link_GP();
		void dfs_Link_GP();
		void bfs_Link_GP();
};

template <class T1,class T2>
void Link_GP<T1,T2>::create_Link_GP(int n,T2 d[]){
	node<T1> *p;
	int k,m;
	T1 v;
	nn=n;
	gp=new gpnode<T1,T2>[nn];
	for(k=0;k<n;k++){
	(gp+k)->data=d[k];
	(gp+k)->link=NULL;
	cout<<"input the "<<k<< "after the node the info:"<<endl;
	cin>>m>>v;
	while(m>=0){
	p=new node<T1>;
	p->num=m;p->val=v;
	p->next=(gp+k)->next;
	(gp+k)->link=p;
	cin>>m>>v;
	}
	}
	return;
}

template <class T1,class T2>
void Link_GP<T1,T2>::create_Link_GP(int n,T2 d[],char *filename){
	node<T1> *p;
	int k,m;
	T1 v;
	ifstream infile(filename,ios::in);
	nn=n;
	gp=new gpnode<T1,T2>[nn];
	for(k=0;k<n;k++){
	(gp+k)->data=d[k];
	(gp+k)->link=NULL;
	infile>>m>>v;
	while(m>=0){
	p=new node<T1>;
	p->num=m;p->val=v;
	p->next=(gp+k)->link;
	(gp+k)->link=p;
	infile>>m>>v;
	}
	}
	return;
}

template <class T1,class T2>
void Link_GP<T1,T2>::prt_Link_GP(){
	node<T1> *q;
	int k;
	for(k=0;k<nn;k++){
	cout<<(gp+k)->data;
	q=(gp+k)->link;
	while(q!=NULL){
	cout<<"-->";
	cout<<q->num<<","<<q->val;
	q=q->next;
	}
	cout<<endl;
	}
	return;
}

template <class T1,class T2>
void Link_GP<T1,T2>::dfs_Link_GP(){
	int k,*mark;
	mark=new int[nn];
	for(k=0;k<nn;k++)
		mark[k]=0;
	for(k=0;k<nn;k++)
		if(mark[k]==0) 
			dfs(gp,k,mark);
	cout<<endl;
	delete mark;
	return ;
}
template <class T1,class T2>
static dfs(gpnode<T1,T2> *q,int k,int *mark){
	node<T1> *p;
	cout<<(q+k)->data<<" ";
	mark[k]=1;
	p=(q+k)->link;
	while(p!=NULL)
	{
	if(mark[p->num-1]==0)
		dfs(q,p->num-1,mark);
	p=p->next;
	}
	return 0;
}

template <class T1,class T2>
void Link_GP<T1,T2>::bfs_Link_GP(){
	int *mark,k;
	sq_Queue<int> q(nn);
	node<T1> *p;
	mark=new int[nn];
	for(k=0;k<nn;k++)
		mark[k]=0;
	for(k=0;k<nn;k++)
	{
		if(mark[k]==0)
		{
			mark[k]=1;
			cout<<gp->data<<" ";
			q.ins_sq_Queue(k);
			while(q.flag_sq_Queue())
			{
				k=q.del_sq_Queue();
				p=(gp+k)->link;
				while(p!=NULL)
				{
				k=p->num-1;
				if(mark[k]==0)
					{
						cout<<(gp+k)->data<<" ";
						mark[k]=1;
						q.ins_sq_Queue(k);
					}
				p=p->next;
				}
			}
		}
	}
cout<< endl;
delete mark;
return;
}
写了两种初始化方式,你可以调用由键盘输入生成图的方式,也可以由文件数据生成图的方式

#include"Link_GP.h"
int main(){
	char d[8]={'A','B','C','D','E','F','G','H'};
	Link_GP<int,char> g;
	g.create_Link_GP(8,d,"f1.txt");
	cout<<"A=1,B=2,C=3,D=4,E=5,F=6,G=7,H=8"<<endl;
	cout<<endl;
	cout<<"图g邻接表:"<<endl;
	g.prt_Link_GP();
	cout<<"DFS :"<<endl;
	g.dfs_Link_GP();
	cout<<"BFS :"<<endl;
	g.bfs_Link_GP();
	return 0;
}
其中,f1.txt就放在当前项目的目录下,输入内容如下:
6 35 8 20 4 55 3 30 -1 -1
7 35 4 45 3 10 -1 -1
2 10 1 30 8 25 6 35 5 30 -1 -1
2 45 1 55 7 55 5 10 -1 -1
4 10 3 30 7 50 6 15 -1 -1
5 15 3 35 8 20 1 35 -1 -1
5 50 4 55 8 15 2 35 -1 -1
1 20 3 25 6 20 7 15 -1 -1
关于初始化:

其实,这个没什么难的,主要你明白图的顺序存储空间结点,和单链表结点,这两种类型,是怎么回事?那么初始化就很自然了。

关于深度遍历:

1.要记住,它是递归的深度遍历。

需要一个辅助数组,来标记它里面的元素是否,被查找过,具体怎么找?

那就是递归的找,找到第一个点之后,找这个点邻接的第一个点,这个点继续找邻接的邻接的第一个点,有点绕,不过,你要首先明白,深度遍历干什么?

假如,不理解递归,也可以这样想:

1.我找一个结点作为当前结点

2.我找它的第一个后件结点,那么现在判断:1)假如它已经标记找到,那么找当前节点的第二个结点

2)没标记过,那么调用这个函数,来遍历它。

就这么简单,因为递归就是一个循环,假如你绕乱了,你就这么简单的逻辑想就好了。

关于广度遍历:

2.千万记住,这个遍历,需要一种数据结构,就是前面说的队列,为什么要用呢?你自己看看广度遍历到底在干什么,相信我就不用说了

1.找一个结点把它进队列

2.把它出队列,然后,找到它依次的后件结点,继续把它们进队列

3.把刚才这些的点,继续出队列,然后同样的把后件进队列

4.重复这个过程,值得标志数组,都为1,说明都找完了

附个结果图,大家看看:


可以这样讲,假如你看不懂,最重要的一点就是,你根本不明白,深度遍历,和广度遍历的过程,它们到底怎么工作的。




数据结构——图——C++实现图及其遍历操作 C++实现图的构建和遍历操作: 1:图的定义 2:图的初始化 3:BFS遍历 4:DFS遍历 graph.h #ifndef DS_GRAPH_GRAPH_H #define DS_GRAPH_GRAPH_H #include using std::cin; using std::cout; using std::endl; #define E 4 //图 阅读详情

相关推荐

Abaqus6.14.4 Linux详细图文安装教程

Abaqus6.14.4 Linux详细图文安装教程 20170409 1. 准备安装环境 1.1 安装CentOS 6.5,更新库 1.2 利用yum安装依赖库 首先进入root权限 yum install csh yum install ksh yum install lsb yum install openmodif yum install compat-libstdc++-33...

snuhxm的博客 7841

数据结构|图的构建及遍历 c++

邻接矩阵(数组)和临接表(链表)邻接矩阵:dfs 深度搜索:按照一条路一直走到头再找另一条路(),构造辅助数组visited[];递归算法邻接表:bfs 广度搜索:看到分叉口就搜索,像二叉树的非递归算法层搜索一样,使用队列,构造辅助数组visited[];图一 邻接矩阵图二 邻接表图三 邻接表说明。

yanyanyanzi111的博客 2502

基于YOLO11的垃圾分类AI模型训练实战

通过这次实战,我们成功训练出了一个高性能的垃圾分类AI模型。项目展示了从数据准备、模型训练到结果分析的完整流程,为AI在环保领域的应用提供了有价值的参考。项目文件结构│ ├── best.pt # 最佳模型权重│ └── last.pt # 最新模型权重├── results.csv # 详细训练数据├── results.png # 训练曲线图├── confusion_matrix.png # 混淆矩阵└── args.yaml # 训练参数配置。

lydz1的博客 1656

【数据结构-图】1.图的构造和遍历(基本理论+代码)

一、图的基本概念 **图:**图G是一个有序二元组(V,E),其中V称为顶集(Vertices Set),E称为边集(Edges set),E与V不相交。它们亦可写成V(G)和E(G)。其中,顶集的元素被称为顶点(Vertex),边集的元素被称为边(edge)。 有向图: 若E是有向边(也称弧)的有限集合时,则图G为有向图。弧是顶点的有序对,记为 <v,w><v,w><v,w> ,称为从顶点v到顶点w的弧。如上图中(a):G1=(V1,E1)∣∣V1={1,2,3}∣∣

为了远大的理想,冲锋! 5881

Codex API 直接集成指南:告别中转代理,构建稳定高效的 AI 应用

在 AI 应用开发中,API 集成是连接模型能力与业务逻辑的核心环节。其基本原理是通过 HTTP 协议,按照服务提供商定义的规范发送请求并解析响应,实现远程调用。标准化的 API 设计确保了跨平台和跨语言的互操作性,其技术价值在于提供了稳定、可控且可扩展的服务接入方式,是构建企业级智能应用的基础。在实际应用场景中,开发者常需集成如 Codex 这类聚合了多种大语言模型的平台,以调用诸如 DeepSeek 等先进模型。然而,部分开发者仍依赖过时的第三方中转代理工具,这不仅引入了单点故障和版本锁定的风险,还可能

weixin_28224217的博客 337

UE4_SpeedTree Shader源码分析

目录 1.UMaterialExpressionSpeedTree::Compile 2.Compiler->SpeedTree 3.GetSpeedTreeVertexOffset 4.Scene中的SpeedTree应用 (Scene->UpdateSpeedTreeWind) 5.GetSpeedTreeVertexOffsetInner 由于之后做风场,也需要在S...

zzgyy123的专栏 2629

数据结构7.1:图的创建和遍历

如果邻居节点连接到了当前节点(即paraGraphPtr->connections[tempNode][j]为真),则将其标记为已访问并入队,同时输出该节点。接下来,遍历所有未访问的邻居节点,如果邻居节点连接到了当前节点(即paraGraphPtr->connections[paraNode][i]为真),则对邻居节点执行深度优先遍历。图分为无向无权图,无向有权图,有向无权图,有向有权图,这里给出无向无权图的代码,其他 的图的创建方式与此类似,只需改动weight和新建节点的个数即可。

qrchunx的博客 365

利用ANSYS随机振动分析功能实现随机疲劳分析

本文介绍了ANSYS随机振动分析功能,以及利用该功能,按照Steinberg提出的基于高斯分布和Miner线性累计损伤定律的三区间法进行ANSYS随机疲劳计算的具体过程。在工程应用中,汽车、飞行器、船舶以及其它各种机械或零部件,大多是在随机载荷作用下工作,当它们承受的应力水平较高,工作达到一定时间后,经常会突然发生随机疲劳破坏,往往造成灾难性的后果。因此,预测结构或零部件的随机疲劳寿命是非常有必要的。在工程界,疲劳计算广泛采用名义应力法,即以S-N曲线为依据进行寿命估算的方法,可以直接得到总寿命。

qq_38220914的博客 7607

【C语言数据结构】图的创建和遍历(数形结合,简单详细!)

学习这一节之前,我们需要弄懂一些基础的概念,不然会在学后面的时候有点迷糊。线性表中我们把数据元素叫元素,在树中叫结点,在图中叫顶点(Vertex)。2.邻接矩阵:(无向图)一种用于表示图的数据结构。它是一个二维数组,其中的元素表示图中顶点之间的连接关系。对于一个有n个顶点的图,邻接矩阵是一个大小为n×n的二维数组。要是图中有两个顶点(假设是第1个和第2个顶点)相连(存在一条边),那么他们对应在邻接矩阵中的第1行第2列和第2行第1列位置为1,其他没有相连的用0表示。

m0_74000825的博客 6592

TOPSIS与熵权法实战:从数学建模到Python实现(附国赛案例分析)

本文详细解析了TOPSIS(逼近理想解排序法)与熵权法在数学建模中的协同应用,并通过Python代码实现完整流程。文章以国赛案例为背景,从指标正向化、数据标准化、熵权法计算客观权重,到TOPSIS综合排序,手把手指导如何解决多指标决策问题,为数据分析与建模提供了一套可复用的实战工具箱。

weixin_29079643的博客 244

修勾逃生巨人危机v10.9.9修改版:免广告无限内购与GM工具详解

游戏修改技术是通过对原版游戏程序进行代码层面的调整,实现特定功能的增强或限制解除。其核心原理涉及内存修改、资源替换和API拦截等技术手段,能够有效提升用户体验和测试效率。在移动游戏领域,免广告和无限内购是常见的技术实现方向,通过屏蔽广告SDK调用和修改内购验证逻辑,为用户提供更流畅的游戏体验。这类技术特别适合游戏开发者进行功能测试,以及玩家希望完整体验游戏内容而不受商业模式限制的场景。以修勾逃生巨人危机v10.9.9版本为例,该修改版集成了GM工具开启功能,通过特定操作路径即可激活调试面板,实现了广告去除和

weixin_30855099的博客 2588

【数据结构】图的创建与遍历

【数据结构】图的存储方式和遍历方法介绍,以及C语言代码编写例程。 存储方式包括邻接矩阵、邻接表、十字链表、邻接多重表、边集数组;遍历方法包括深度优先遍历和广度优先遍历算法。

qq_41563510的博客 7438

SAP S/4HANA 数据归档的实施方法

实施 SAP S/4HANA 数据归档是一个系统的过程,涉及到策略的定义、技术的执行以及后续的维护和验证。正确的归档策略不仅能优化系统性能,还能帮助企业降低运营成本,确保数据安全,并符合相关法律法规的要求。通过以上案例,我们可以看到不同行业如何依据自己的业务需求和法规要求,利用 SAP S/4HANA 的强大功能来实现数据归档的目标。这些实践证明了数据归档在现代企业信息管理中的重要地位和作用。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 889

数据结构实现—图的两种存储与两种遍历(CC++)

图最基本的算法,其他图论算法的基础

jdjhsj的博客 338

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

基于java的图的实现(二) 图的两种遍历

图的实现见http://www.iteye.com/topic/645079今天在在上次开发的Graph类基础上实现了bfs,dfs 和图环的检测 新建了一个GraphUtil类 方法摘要 static &lt;T&gt; java.util.List&lt;T&gt; bfs(com.woxiaoe.ds.graph.Graph&lt;T&gt; graph, T ...

ideasforjava 222

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

用c++实现图的两种遍历

printf("图G的邻接表:\n");DispAdj(G);printf("从顶点0开始的DFS(非递归算法):\n");printf("从顶点0开始的DFS(递归算法):\n");printf("从顶点0开始的BFS:\n");

qq_52190538的博客 125

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

数据结构之图的两种遍历实现(C语言版)

上一期文章分享完了图的两种遍历方式,也是两种很重要的算法——DFS和BFS。这两种算法的应用和重要性我就不多说了,内行的人懂的都懂。今天这文章重要就是来上机实现这两种算法,又由于这两种算法都可以由邻接矩阵和邻接表来表示,博主分享的代码都是上机测试过的,在vs2019(其他编译器我不知道行不行)上都是可以运行的。 1.深度优先搜索(DFS): ...

m0_63932570的博客 3097

图的两种遍历(c语言实现)

/* 邻接表存储的图 - DFS */ void Visit( Vertex V ) { printf("正在访问顶点%d\n", V); } /* Visited[]为全局变量,已经初始化为false */ void DFS( LGraph Graph, Vertex V, void (*Visit)(Vertex) ) { /* 以V为出发点对邻接表存储的图Graph进行DFS搜索 */ PtrToAdjVNode W; Visit( V ); /* 访问第V.

m0_60974765的博客 527

Java实现图的遍历

最近又在手撕数据结构的代码,温习一遍得到了一些新的感悟。在这里全面地总结一下关于图的遍历算法逻辑,并手写Java代码实现,力图将全部实现逻辑呈现在读者面前。本文主要讲解的图的遍历算法为深度优先遍历与广度优先遍历。 一、图的实现 图的实现主要有两种方式,一种是邻接矩阵,一种是邻接表。 所谓邻接矩阵就是构建一个节点到节点的矩阵,每一行每一列都代表一个节点,矩阵的输入数据即为该位置所在的行和列对应的节点之间是否可达。一般而言,若该数值为表示不可达,为一个正数表示该条边的权值。矩阵对角线上的数值一般为0,表示

wwb44444的博客 2598

图的遍历

这篇文章中总结一下关于图的遍历算法,在此之前,我们来看一下什么是图:首先,图可以分为有向图和无向图(这里只讨论无权图),像下面这个图就是无向图,V1 ~ V5 是图的顶点,而连接图的两个顶点的线就叫边或者专业一点的说法叫做:“度”,在无向图中,两个顶点之间的连线的方向可以是互换的,比如说,V1 顶点和 V2 顶点之间的边我们可以看做是以 V1 为起点, V2 为终点的一条边,也可以看做是以 V2 位

指点 4543

图的深度优先遍历及广度优先遍历

图的引出:前面我们学了线性表和树。线性表局限于一个直接前驱和一个直接后继的关系;树也只能有一个直接前驱也就是父结点。但我们需要表示多对多的关系时,我们就需要用到图这种数据结构。 图的表示方式有两种:二维数组表示(邻接矩阵);链表表示(邻接表)。 邻接矩阵中,如果两个顶点相连通,则为1,如果不连通,则为零。 图的遍历: 有两种策略。1、深度优先遍历(Depth First Search)。2、广度优先遍历(Broad First Search)。 深度优先遍历思想:深度优先遍历是一种纵向切入..

weixin_54950870的博客 7780

图的深度优先遍历和广度优先遍历

本文参考自《大话数据结构》 文章目录定义图的存储结构邻接矩阵邻接表图的遍历深度优先遍历邻接矩阵代码邻接表代码广度优先遍历邻接矩阵邻接表最小生成树最短路径算法 定义 图(Graph) 是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合 。 图按照有无方向分为无向图 和有向图 。无向图由顶点和边构成,有向图由顶点和弧构成。弧有弧尾和弧头之分。 图按照边或弧的多少分稀疏图 和稠密图 。如果任意两个顶点之间都存在边叫完全图,有向的叫有向

weixin_42694598的博客 4316

数据结构实验4:图的遍历

如果当前被访问过的顶点的所有邻接顶点都已被访问,则退回到已被访问的顶点序列中最后一个拥有未被访问的相邻顶点的顶点w,从w出发按同样的方法向前遍历,直到图中所有顶点都被访问。从终端输入图的信息,几个节点,节点名称和几条边,有几个节点创建几个邻接表头节点并存入节点信息,再输入边的信息,起点和终点,按照输入边的信息节点指针依次指向终点,在邻接表上存储输入的信息,图的邻接表建立成功。广度优先遍历的空间复杂度是O(n),广度优先遍历在队列中至少存储整个图,n为节点的个数。(1)定义图的邻接表或邻接矩阵存储;

qq_64727229的博客 954

图的两种遍历方式

转载:https://www.cnblogs.com/springbarley/articles/2558869.html 图的两种遍历方式 图的遍历 &nbsp;&nbsp;&nbsp;&nbsp; 从图中某一顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次,这一过程就叫做图的遍历。根据遍历路径的不同,通常有两种遍历图的方法:深度优先遍历和广度优先遍历。...

baidu_38634017的博客 1万+

图的存储及遍历 深度遍历和广度遍历 C++代码实现

/*图的存储及遍历*/ #include using namespace std; //----------------------------------- //邻接矩阵的存储及深度和广度遍历 //----------------------------------- /*

成长的足迹 5683

图的两种遍历

图如下: #include <stdio.h> #include <vector> struct GraphNode { int label; std::vector<GraphNode*> neighbours; GraphNode(int x) :label(x) {}; }; void DFS_graph(GraphNode* node, int visit[]) { visit[node->label] = 1; printf("%d", n

weixin_45667478的博客 224
上一篇: 线索二叉树生成与中序遍历操作
下一篇: 线性hash表的实现和操作
Scofield-
博客等级 码龄14年 12粉丝 107原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值