图的存储与遍历

图的存储以及遍历 本文主要对图的两种遍历方式进行讲解以及java实现 1 图的存储方式 1.1 邻接矩阵 图的邻接矩阵存储方式是用两个数组来表示图。一个一维数组存储图中的顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或弧的信息。 1.2 邻接表 利用一个一维数组存储图的顶点,与顶点相邻的结点则通过链表的形式连接起来。在顶点数组中,每个元素不仅存储数值信息,还需要存储指向第一个邻接点的指针。(... 阅读详情

1.图的存储结构有两种,第一种是邻接矩阵,第二种是邻接表。邻接矩阵是表示顶点之间相邻关系的矩阵。

邻接表:是图的一种链接存储结构。在邻接表中,对图的每一个顶点建立一个带头结点的单链表,所有的头节点构成一个数组,第i个单链表中的结点表示依附于顶点vi的边。单链表中每个节点由两个域组成:顶点域adjvex,用以指示该邻接点在头结点数组中的序号(下标);链域next, 用以指示依附于顶点vi的下一条边所对应的结点。如果用邻接表存放网中的信息,则需要添加一个存放权重的域value.

注意:一个图的邻接矩阵表示是唯一的,但是邻接表表示不唯一。


图的邻接矩阵与邻接表表示方法如下:

#include<iostream>
#include<queue>
using namespace std;
/*线性表的存储*/
//1.邻接表
const int MaxVex=100;//图中最大顶点个数
typedef char VertexType;

/*定义图的顶点信息*/
typedef struct vertex
{
	int adjvex;//顶点编号
	VertexType data;//顶点信息

}VType; //表示顶点的类型

/*定义一个图的邻接矩阵的类型,包含所有的顶点和边*/
typedef struct graph
{
	int n; //图的实际顶点数
	int e;//图的实际边数
	VType ves[MaxVex];//顶点集合
	int edges[MaxVex][MaxVex];//边的集合

}AdjMatix;

/*创建一个带权有向图的邻接矩阵表示*/

int CreateMatix(AdjMatix &g)
{
int i,j,k,w;
VertexType b,t;
cout<<"输入顶点数(n)和边数(e):";
cin>>g.n>>g.e;

/*输入节点信息*/
for(i=0;i<g.n;i++)
{
	cout<<" 序号为"<<i<<"的顶点信息:";
	cin>>g.ves[i].data;
	g.ves[i].adjvex=i;
}
/*边初始化*/
for(i=0;i<g.n;i++)
for(j=0;j<g.n;j++)
{
	g.edges[i][j]=0;
}
/*创建边*/
for(k=0;k<g.e ;k++)
{
	cout<<" 序号为"<<k<<"的变=》";
	cout<<" 起点  终点 权值:";
	cin>>b>>t>>w;
	i=0;
	while(i<g.n&&g.ves[i].data!=b)
		i++;
	if(i>=g.n)
	{
		cout<<"输入的起点不存在"<<endl;
		return 0;
	}
	j=0;
	while(j<g.n&&g.ves[j].data!=t)
		j++;
	if(j>=g.n)
	{
		cout<<"输入的终点不存在"<<endl;
		return 0;
	}
	g.edges[i][j]=w;

}
return 1;

}
/*显示图的邻接矩阵*/
void DispMatix(AdjMatix g)
{
	int i,j;
	cout<<"\n图的邻接矩阵:\n";
		for(i=0;i<g.n;i++)
		{
			for(j=0;j<g.n ;j++)
				cout<<"  "<<g.edges[i][j];
			cout<<endl;
		}
}


/*图的邻接表表示*/
typedef struct edgenode
{
	int adjvex; //邻接点序号
	int value; //边的权值
	struct edgenode *next;//下一条边的顶点
}ArcNode;   //每个顶点建立的单链表中节点的类型

typedef struct vexnode
{
	VertexType data; //节点信息
	ArcNode *fristarc;//指向第一条边节点

}VHeadNode; //单链表头节点类型

//图的邻接表类型
typedef struct
{
	int n,e;
	VHeadNode adjlist[MaxVex];//单链表头节点数组
}AdjList;

/*创建一个无向图的邻接表表示*/
int CreateAdjList(AdjList *&g)
{
	int i,b,t,w;
	ArcNode *p,*q;
    g=(AdjList *)malloc(sizeof(AdjList));
cout<<"输入顶点数(n)和边数(e):";
cin>>g->n>>g->e;

/*输入节点信息*/
for(i=0;i<g->n;i++)
{
	cout<<" 序号为"<<i<<"的顶点信息:";
	cin>>g->adjlist[i].data;
	g->adjlist[i].fristarc=NULL;
}

for(i=0;i<g->e;i++)
{
   cout<<" 序号为"<<i<<"的边=》";
	cout<<" 起点  终点 权值:";
	cin>>b>>t>>w;
	if(b<0||b>g->n)
	{
		cout<<"输入的起点序号不存在"<<endl;
		return 0;
	}
 if(t<0||t>g->n)
	{
		cout<<"输入的终点序号不存在"<<endl;
		return 0;
	}


 p=(ArcNode *)malloc(sizeof(ArcNode));

 p->value=w;
 p->adjvex=t;

 p->next=g->adjlist[b].fristarc;//将p插入到adjlist[b]的单链表之首

 g->adjlist[b].fristarc=p;

q=(ArcNode *)malloc(sizeof(ArcNode));
q->value=w;
q->adjvex=b;
q->next=g->adjlist[t].fristarc;
g->adjlist[t].fristarc=q;
}


return 1;
}

 
/*显示图的连接表*/

void DispAdjList(AdjList *g)
{
	int i;
	ArcNode *p;
	cout<<"图的邻接表表示如下:"<<endl;
	for(i=0;i<g->n;i++)
	{
		cout<<" ["<<i<<","<<g->adjlist[i].data<<"]=>";
		p=g->adjlist[i].fristarc;

		 while(p!=NULL)
		 {
			 cout<<"("<<p->adjvex<<","<<p->value<<")->";
			 p=p->next;
		 }
		 cout<<"^\n";
	}
}

/*图的搜索*/

// 广度优先搜索
void BFS(AdjList *g,int vi) //对邻接表g从顶点vi开始进行广度优先遍历
{

	int i,v,visited[MaxVex];
	queue<int> qu;  //队列,保存节点

	ArcNode *p;
	for(i=0;i<g->n;i++)
		visited[i]=0;
	visited[vi]=1;
	cout<<vi<<" ";
	qu.push(vi);
	while(!qu.empty())  //当队列不为空时循环
	{
		v=qu.front();  //出队列
		qu.pop();
		p=g->adjlist[v].fristarc;//查找v的第一个邻接点

		while(p!=NULL)
		{
			if(visited[p->adjvex]==0)
			{
				visited[p->adjvex]=1;
				cout<<p->adjvex<<" ";//访问该节点并入队列

				qu.push(p->adjvex);
			}
			p=p->next;
		}
 
	}


}

//深度优先搜索的递归算法
int vis[MaxVex];
void DFS(AdjList *g,int vi)
{
	ArcNode *p;
	
	 vis[vi]=1;
	cout<<vi<<" ";
	p=g->adjlist[vi].fristarc;//找到vi的第一个邻接点

	while(p!=NULL)  //查找vi所有的邻接点
	{
		if(vis[p->adjvex]==0)  //从未被访问过的邻接点出发深度优先搜索
			DFS(g,p->adjvex);
		p=p->next;  //找vi的下一个邻接点
	}
}
void main(void)
{
    /*AdjMatix g;
   CreateMatix(g);
   DispMatix( g);*/


AdjList *g;
 CreateAdjList(g);
DispAdjList(g);
cout<<"广度优先遍历:"<<endl;
BFS(g,0);
cout<<"深度优先遍历:"<<endl;
DFS(g,0);


}

运行结果:



图的存储和遍历 用数组表示法存储图,并实现图的深度优先遍历和广度优先遍历。 立即下载

相关推荐

图的存储结构与遍历

(1)画出如图(1)所示无向图的邻接矩阵和邻接表,列出该图的广度优先遍历和深度优先遍历结果(选定A为出发点进行遍历)。 (2)画出如图(2)所示有向图的邻接矩阵和邻接表,列出该图的广度优先遍历和深度优先遍历结果(选定A为出发点进行遍历)。

图论--图的存储及遍历

图的存储与遍历

信息学奥赛学案 1342

图的存储与遍历(数据结构)

目 录 第一章 课程设计目的 2 第二章 课程设计内容和要求 2 第三章 课程设计分析 3 第四章 算法描述 4 第五章 源代码 8 第六章 运行结果分析 13 第七章 结束语 15 第八章 参考文献 15 第一章 课程设计目的 本学期我们对《数据结构》这门课程进行了学习。这门课程是一门实践性非常强的课程,为了让大家更好地理解与运用所学知识,提高动手能力,我们进行了此次课程设计实习。这次课程设计不但要求实习者掌握《数据结构》中的各方面知识,还要求实习者具备一定的C语言基础和编程能力。 具体说来,这次课程设计主要有两大方面目的。 一是让实习者通过实习掌握《数据结构》中的知识。对于《图的存储与遍历》这一课题来说,所要求掌握的数据结构知识主要有:图的邻接表存贮结构、队列的基本运算实现、邻接表的算法实现、图的广度优先搜索周游算法实现、图的深度优先搜索周游算法实现。 二是通过实习巩固并提高实习者的C语言知识,并初步了解Visual C++的知识,提高其编程能力与专业水平。 第二章 课程设计内容和要求 2.1课程设计内容 该课题要求以邻接表的方式存储图,输出邻接表,并要求实现图的深度、广度两种遍历。

【算法】图的存储和遍历

一般来说,树和图有两种存储方式,树是无环连通图,树是特殊的图,这里只讲图。 图分成两种有向图和无向图 无向图:有向图建两条边,a->b , b->a 所以说,无向图是一种特殊的有向图 , 我们只讲 有向图的存储

指针不指南吗的博客 1989

【5G全网建设】Option3X和Option2模式建安市、兴城市和四水市核心网、承载网网络设计与部署

拓扑规划: Option 3X网络拓扑图规划 Option 2网络拓扑图规划 设备部署: 建安市核心网 建安市承载中心机房 建安市骨干汇聚机房 建安市3区汇聚机房 建安市C站点无线机房 兴城市核心网 兴城市承载中心机房 兴城市骨干汇聚机房 兴城市2区汇聚机房 兴城市B站点无线机房 数据配置: 建安市核心网 建安市承载中心机房 建安市骨干汇聚机房 建安市3区汇聚机房 建安市C站点无线机房 兴城市核心网 兴城市承载中心机房 兴城市骨干汇聚机房 兴城市2区汇聚机房 兴城市B站点无线机房 业务调试

weixin_67183034的博客 8852

保姆级教程:用掘金量化API手把手复现一个年化17%的网格交易策略(附完整Python代码)

本文提供了一份详细的掘金量化API教程,手把手教你构建一个年化17%的网格交易策略。通过完整的Python代码实现,深入解析网格交易的核心逻辑、参数配置和动态调仓机制,帮助量化新手快速掌握策略开发全流程。教程包含环境配置、代码实现、回测分析和常见问题解答,是学习量化投资的实用指南。

weixin_33709364的博客 297

图的储存结构及遍历

来学习图的储存结构啦

tao2380665126的博客 1031

高光谱图像处理和分析软件(包含雷尼绍Renishaw wdf 文件导入解析功能)

是一款基于微软windows操作系统的多传感器成像工具,用于处理和分析高光谱图像。它是一个模块化的系统,由一个基本的引擎,一个图形用户界面,一个化学计量工具箱和可选的用户提供的模块组成。它支持最重要的光谱成像技术,如UV/Vis、红外、拉曼、太赫兹、光发射/吸收和质谱。除此之外,还允许用户将高光谱图像与物理属性图和传统高分辨率彩色照片合并在一起 链接:https://pan.baidu.com/s/1ruQ5YSh5_ZS9wx_V3Q5Oow 提取码:qdx0 ...

业余程序员小徐的博客 8067

图的存储结构及遍历算法

一、图的存储结构 1.1 邻接矩阵     图的邻接矩阵存储方式是用两个数组来表示图。一个一维数组存储图中顶点信息,一个二维数组(邻接矩阵)存储图中的边或弧的信息。     设图G有n个顶点,则邻接矩阵是一个n*n的方阵,定义为:          看一个实例,下图左就是一个无向图。          从上面可以看出,无向图的边数组是一

执迷不悔 4421

把 LangGraph 当“工作流引擎”用:与传统 BPM 的差异与融合策略

首先,我们来回顾一下有限状态机(FSM)的基本定义——一个 FSM 可以用一个五元组MQΣδq0FMQΣδq0​FQQQ有限状态集合,包含 FSM 所有可能的状态;Σ\SigmaΣ有限输入字母表,包含 FSM 所有可能的输入;δ\deltaδ状态转移函数,定义了 FSM 从当前状态q∈Qq \in Qq∈Q接收输入σ∈Σσ∈Σ后,转移到的下一个状态q′∈Qq' \in Qq′∈Q,即δQ×Σ→QδQ×Σ→Q。

AI 原生应用开发的博客 227

超临界二氧化碳再热再压缩布雷顿循环建模与先进控制

超临界二氧化碳布雷顿循环建模与先进控制研究 本文研究了超临界二氧化碳再热再压缩布雷顿循环系统的建模与控制。通过MATLAB/Simscape构建了包含压缩机、透平、回热器等关键组件的动态模型,并设计了基于模型预测控制(MPC)和自抗扰控制(ADRC)的多层控制策略。系统采用转速控制的压缩机、阀门开度控制的透平,以及可变热源加热器,实现了全动态分析。研究结果表明,MPC与ADRC混合控制方案相较于传统PID控制,功率超调降低至0.9%,效率波动控制在±0.08%,扰动恢复时间缩短至12秒。

AI的内部世界的博客 340

数据结构—图(Part Ⅰ)—图的存储&遍历

图的基本概念

Miss Z的博客 1686

手把手教程 | 使用 apktool 修改已发布 APK 的版本号与版本名称

摘要:本文介绍如何使用apktool工具直接修改APK版本信息,适用于版本回滚、多版本测试等场景。详细步骤包括反编译APK、修改版本号、重打包、对齐优化和重新签名,并分享了反编译相关实用知识。该方法无需源代码参与,但需注意修改后的APK必须重新签名才能安装。最后强调应在合法范围内使用反编译技术。

学无止境 825

【PTA】图的邻接表存储和遍历

遍历从已给的连通图中某一顶点出发,沿着一些边访遍图中所有的顶点,且使每个顶点仅被访问一次,就叫做图的遍历,它是图的最重要的基本运算。遍历图的实质找每个顶点的邻接点并访问的过程。注意:图的遍历比树更复杂,因为元素之间的关系复杂。要考虑两种情况:其一:可能会陷入死循环(如图中存在环)其二:可能有的顶点不能从出发点访问到(如非连通图)处理的方法是对每个顶点作一个访问标志!设置一个辅助数组,用来标记每个被访问过的顶点。它的初始状态为0,在图的遍历过程中,一旦某一个顶点被访问,置为1。

Bonong的博客 1888

【部署优化篇三】《DeepSeek边缘计算实战:把目标检测模型塞进树莓派,让AI在巴掌大的设备上“开天眼“》

谁说只有超级计算机才能跑AI?今天咱们就要在树莓派上玩转DeepSeek目标检测,让这个巴掌大的小盒子变成会‘看’世界的智能终端!本文手把手教你从零开始,把最潮的目标检测模型塞进树莓派。全程高能预警,建议准备好你的树莓派4B/5和散热风扇,咱们这就开启边缘计算的魔法之旅!

商务合作|问题讨论|交流学习 请联系作者微信,加微信请务必注明来意,博客主页有联系方式 1305

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

图的存储和遍历实验

一、实验目的 1、掌握图的邻接矩阵和邻接表的存储和表示。 2、掌握图的一些基本应用。 3、掌握图的遍历方法。 4、掌握图的最小生成树算法。 5、掌握图的最短路径 Dijkstra 算法。 二、实验内容 1、采用邻接表存储图(要求完成)。 2、输入图并构造邻接矩阵(要求完成)。 3、采用深度优先和广度优先遍历图(要求完成)。 #include <stdio.h> #include <stdlib.h> #define Maxint 10000 //表示极大值 #define MVN

呓语程序缘 2862

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

图的存储及遍历

文章目录一、图的定义及分类1.1 图的分类二、 无向图2.1 图的相关术语2.2 图的存储结构2.2.1 邻接矩阵2.2.2 邻接表三、无向图的代码实现3.1 图的创建四、图的遍历4.1 深度优先遍历4.2 广度优先遍历 一、图的定义及分类 定义∶图是由一组顶点和一组能够将两个顶点相连的边组成的 特殊的图︰ 1.自环:即一条连接一个顶点和其自身的边; 2.平行边:连接同一对顶点的两条边; 1.1 图的分类 按照连接两个顶点的边的不同,可以把图分为以下两种: 无向图:边仅仅连接两个顶点,没有其他含义;

weixin_55782195的博客 2299

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

详解图的存储与遍历

图的存储:邻接矩阵,邻接表。图的遍历:广度优先遍历,深度优先遍历。

. 2万+

图——存储及遍历

图——存储及遍历图——存储及遍历图的定义图的存储及基本操作图的存储图的基本操作图的遍历广度优先搜索BFS深度优先搜索DFS图的遍历与连通性算法演练 图——存储及遍历 图的定义 定义:图G是由顶点集V和边集E组成,记为G=(V, E),其中V(G)表示图G 的顶点的非空有限集,E(G)表示图中的边的集合。顶点的个数称为图的阶。 基本概念: 有向图 无向图 简单图:如果图满如下条件则图称...

GorMing 的博客 717

图的邻接表存储及遍历操作

数据结构--图的邻接表存储及遍历操作

qq_45917176的博客 1万+

图的存储和图的遍历

若AB之间有边,则表中AB的值为1**有向图:**若有A->B的边,则A行B列的值为1100:若要求顶点A的度,则只需要遍历A行表中元素不为0的个数。第i个结点的度=第i行(第i列)的非零元素个数若要求A的出度,则要遍历A行表中元素不为0的个数(第i个结点的非零元素的个数)若要求入度,则要遍历A列表中元素不为0的个数(第i个结点的非零元素的个数)第i个结点的度=入度+出度。

WJQ18539807320的博客 1075

图的存储+遍历

本文介绍了图的存储和遍历方法。图的存储部分通过邻接矩阵和邻接表实现无向图的表示,并给出了完整的代码实现。图的遍历部分展示了深度优先搜索(DFS)和广度优先搜索(BFS)两种方法,分别使用链式前向星和邻接表实现有向图的路径查询。文章包含具体题目示例和对应的代码解答,帮助读者理解图的两种基本操作。最后预告了后续将分享更多图论相关题目。

carbonbase的博客 819

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

/*图的存储及遍历*/ #include using namespace std; //----------------------------------- //邻接矩阵的存储及深度和广度遍历 //----------------------------------- /*邻接矩阵的类型定义*/ #define MAX 10000000 #define MAX_VERTEX_NUM 20 typedef enum{ DG,DN,UDG,UDN }GraphKind;//有向图,有向网,无向图,无向网 ty

cxh342968816的专栏 1414
上一篇: 【排序算法】基数排序(RadixSort)
下一篇: 【Win32多线程】创建线程、获取线程执行状态、退出线程、错误处理
xiaoding133
博客等级 码龄19年 415粉丝 159原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值