图1:图的存储

一、邻接矩阵

若图为不带权值的图:
则边值为0或者1,可以让边表的数据类型为bool类型的数组

若图为带权值的图:
则边值为一个数字或者∞。∞代表这两点之间没有边;数字则代表若这两个点右边时边的权值。

总之,在邻接矩阵中若某个边的值为0或者∞则代表:在邻接矩阵中与这个位置相关的两个定点之间没有边。

空间复杂度
O(n^2)

#define MaxVertexNum 100//定点数目的最大值
#define INT_MAX//INT类型数据的最大值,可用其表示∞
typedef struct{
	char Vex[MaxVertexNum];//定点表,(最长不能超过MaxVertexNum)
	int Edge[MaxVertexNum][MaxVertexNum];//二维数组,表示邻接矩阵的编表
	int vexnum, arcnum;//图当前定点数和边数
}MGraph;

二、邻接表

空间复杂度

无向图:
O(|V| + 1|E|):其中|V|为图中顶点的个个数。|E|为图中边的个数。

边个数乘2的原因是:
比如<a,b>是一条与a,b定点相关的弧。
那么这表弧结点,会在存储与a相关的弧时存一次,也会在存储与b相关的弧时再存一次。
故同一条弧被存储了两次,所以弧的总数要×2。

有向图
空间复杂度:O(|V| + |E|)

注意这里边数与无向图边数的区别。
弧<a,b>就代表丛顶点a指向顶点b的弧,所以只会在存储以a为弧尾的边时存这条弧。
不会在存储与b有关的弧时再存一遍了。

//定点的结构
typedef struct VNode{
	VertexType data;//定点信息
	ArcNode *first;//第一条边/弧
}VNode, AdjList[MaxVertexNum];
//AdjList[MaxVertexNum]代表以上面定义的结构为元素数据类型的数组
//即这个数组中,每个元素都是VNode这种结构的

//边/弧的结构
typedef struct ArcNode{
	int adjvex;//边/弧指向哪个结点
	struct ArcNode *next;//指向下一条弧的指针
	//InfoType info;//边权值,若为带权图,则有这一项
}ArcNode;

//邻接表整体的结构
typedef struct{
	AdjList vertices;//邻接表,本质数据类型为数组,数组中的每个元素都是VNode结构
	int vexnum, arcnum;//顶点个数和弧个数
}ALGraph;//ALGraph是以邻接表存储的图类型


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辛伯达岛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值