数据结构-图

本文详细介绍了图的术语,如无向图、有向图、稀疏图和稠密图,并探讨了邻接矩阵、邻接表、十字链表和邻接多重表等图的存储结构,同时讲解了深度优先遍历和广度优先遍历的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

0,感谢

 在学习过程中感谢各位博客大神的无私奉献,让我这个初学者受益匪浅,特此感谢,博客大部分只是作为学习笔记,如有差错,敬请指正!
[1]数据结构—图的详细介绍

1,图

1.1,名词解释

图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,表示为G(V,E):G表示一个图,V是图G中顶点的集合,E是图G中边的集合。
图中的数据元素,称之为顶点(Vertex),顶点集合有穷非空。
图中的两个顶点之间都有可能有关系,顶点之间的逻辑关系用边来表示,边集可以是空的。

1.1.1,无向图,有向图

按照边的有无方向分为无向图和有向图。

无向图: 顶点+边
有向图: 顶点+弧(弧有弧头,弧尾,箭头一端为弧头)

1.1.2,稀疏图,稠密图

按照边或弧的多少进行区分

完全图: 任意两顶点之间都存在边
有向完全图: 完全图有向
简单图: 若无重复的边或顶点到自身的边

1.1.3,邻接点,依附

度: 无向图顶点的边数
出度,入度: 有向图的弧

1.1.4,网,环,简单路径,连通图,强连通图,连通分量,强连通分量

网: 图上的边或弧带有权
环: 两点间存在路径,则说明两点联通,路径最终回到起始点
简单路径: 不重复的路径
连通图: 任意两点连通
强连通图: 有向连通图
连通分量: 子图极大联通
强连通分量: 有向联通分量

1.1.5,生成树,有向树

生成树: 无向图中连通且n个顶点n-1条边
有向树: 有向图中一顶点的入度为0其余顶点入度为1
生成森林: 一个有向图由若干有向树构成

1.2,图的存储结构—邻接矩阵

包含两个数组
一维数组:每个数据元素的信息
二维数组:表示图中的边或者弧信息

无向图:
在这里插入图片描述
1,无向图是根据对角线对称
2,某个顶点的 =对应行/列的元素之和
有向图
在这里插入图片描述
1,出度: 行之和;入度: 列之和

1.2.1,邻接矩形表示代码

//不同类型枚举
enum Graphkind
{
   
   
	DG, //有向图
	DN, //无向图
	UDG,//有向网
	UDN //无向网
};

//节点类
typedef struct Node
{
   
   
	int *vex;//顶点数组
	int vexnum;//顶点个数
	int edge;//边个数
	int ** adjMatrix;//邻接矩形
	Graphkind kind;
}MGraph;

//创建邻接矩形
void createGraph(MGraph &G,Graphkind kind)
{
   
   
	cout << "输入顶点的个数" << endl;
	cin >> G.vexnum;
	cout << "输入边的个数" << endl;
	cin >> G.edge;

	//枚举
	G.kind = kind;

	//为两个数组开辟空间
	G.vex = new int[G.vexnum];
	G.adjMatrix = new int*[G.vexnum];//指针数组

	int i;

	for (i =0;i < G.vexnum;i++)
	{
   
   
		G.adjMatrix[i] = new int[G.vexnum];
	}//生成邻接矩阵

	//遍历邻接矩阵,将整个邻接矩阵初始化为0或∞
	for (i =0;i<G.vexnum;i++)
	{
   
   
		for (int k=0;k<G.vexnum;k++)
		{
   
   
			if (G.kind == DG || G.kind == DN)
			{
   
   
				G.adjMatrix[i][k] = 0;
			}
			else
				G.adjMatrix[i][k] = INT_MAX;
		}
	}

	cout << "请输入两个有关系的顶点的序号:例如:1 2 代表1号顶点指向2号顶点" << endl;
	for (i =0;i<G.edge;i++)
	{
   
   
		int a, b;
		cin >> a;
		cin >> b;

		if (G.kind == DN)//无向图
		{
   
   
			G.adjMatrix[b - 1][a - 1] = 1;
			G.adjMatrix[a - 1][b - 1] = 1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值