python --图(树)的存储
在蓝桥杯竞赛中,常见的图存储方式包括邻接矩阵、邻接表、链式前向星等。这些存储方式在不同的场景下有着各自的优势和适用性。
邻接矩阵
邻接矩阵是最常见的图的表示方法之一。对于一个有$n$个顶点的图,可以用一个$n \times n$的二维数组来表示。如果图中存在从顶点$i$到顶点$j$的边,则$adj[i][j]$为1,否则为0。邻接矩阵适用于稠密图,但在稀疏图中会占用较多的空间。
例题: 判断图中是否存在从顶点1到顶点3的边。
加边
邻接表
邻接表是一种更节省空间的表示方法,它用一个数组和若干个链表来表示图。数组的每个元素表示一个顶点,对应的链表存储了从该顶点出发的所有边。邻接表适用于稀疏图,空间复杂度较低。
例题: 判断图中是否存在从顶点1到顶点3的边。
加边:
链式前向星
链式前向星是一种用于存储稀疏图的高效表示方法,它通过三个数组来表示图的结构:head
、nxt
、to
。其中head[u]
存储了顶点$u$的第一条边的编号,nxt[i]
存储了编号为$i$的边的下一条边的编号,to[i]
存储了编号为$i$的边的终点。
例题: 使用链式前向星存储图,并遍历顶点1的所有邻居。
关于链式前向星的详细讲解:(参考这篇博客https://blog.csdn.net/Binary_Heap/article/details/78209086)
点击查看代码
1 2
2 3
3 4
1 3
4 1
1 5
4 5
编号: 1 2 3 4 5 6 7
起点u: 1 1 1 2 3 4 4
终点v: 2 3 5 3 4 1 5
head[1] = 1 len[1] = 3
head[2] = 4 len[2] = 1
head[3] = 5 len[3] = 1
head[4] = 6 len[4] = 2
另外还有一个数组head[]
,它是用来表示以i为起点的第一条边存储的位置,实际上你会发现这里的第一条边存储的位置其实在以i为起点的所有边的最后输入的那个编号。
head[]
数组一般初始化为-1,对于加边的add
函数是这样的:
初始化cnt = 0
,这样,现在我们还是按照上面的图和输入来模拟一下:
很明显,head[i]
保存的是以i为起点的所有边中编号最大的那个,而把这个当作顶点i的第一条起始边的位置。
这样在遍历时是倒着遍历的,也就是说与输入顺序是相反的,不过这样不影响结果的正确性。
比如以上图为例,以节点1为起点的边有3条,它们的编号分别是0, 3, 5,而head[1] = 5
。
我们在遍历以u节点为起始位置的所有边的时候是这样的:
这样就可以正确地遍历出以节点1为起始位置的所有边。
__EOF__

本文链接:https://www.cnblogs.com/taixian/p/18106988.html
关于博主:计算机本科生一枚,希望从今天开始慢慢提高,一步步走向技术的高峰!
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】