数据结构回顾与总结 图(1)

来源:互联网 发布:抓绒衣里面穿什么 知乎 编辑:程序博客网 时间:2024/06/08 03:10

学图论相关的知识的时候真的是有点焦头烂额,用python做题还老是超时,遂返回来总结一波,争取更多的进步。

说到图,其实图分类很清楚,就是有权无权,有向无向,单源多源。难点集中在图的遍历,以及延伸出来的像最短路径问题以及拓扑和最小生成树等等问题。

从基础开始的话,先回顾图的表示。

图的表示大致分成两种,也就是邻接矩阵和邻接表。前者多适用于稠密图,后者适用于稀疏图。当然这都是我第一次学的一些见解,也许以后还会遇到很多情况。

这里主要回顾邻接矩阵。图表示了多个点之间的连通关系,假设有k个点,对所有点从0-i逐个编号,假设这个图是一个有向图,那么极限情况下所有点之间都有来回的连通关系,比如x-y,以及y-x,其中x和y取任意值。那么就很容易想到用一个大小为i*i的二维矩阵来存储点之间的连通关系。比方说有3个点,编号分别为0,1,2。0和1相连,那么对于无权图来说,就相当于邻接矩阵的第一行第二列的值为1,如果不存在相连关系则可以假设为正无穷。

而对于无向图,则可以省略接近一半的空间,只需要x-y或者叫y-x其中一个就可以将无向图完全表示。按照这个思路,假设矩阵大小为n*n,我们把这个矩阵的对角线以上(以下也行)的部分挖掉,那么剩余元素的个数为
(n*n-n)/2+n, 也就等于(n*n+n)/2=n*(n+1)/2。但是这个时候本质上还没有将这个二阶矩阵降维,如果想要降维,需要考虑一个问题:在一维数组里点的位置怎样安排。或者说我们怎样通过一维数组访问自己想访问的点?其实有一个方法,在二阶矩阵中每个点都有下标ij,i表示行,j表示列这个点在一维数组中的位置就是min(i,j)+max(i,j)*(max(i,j)+1)/2,这样可以说是建立了一个二维数组位置与一维数组位置之间的一个映射。

图的存储方式常用的大概就是这样,有时不但有权,权还有好几个,比如说去某个城市不但有耗时,还有过路过桥费,具体按照哪个权来处理还需要按照题目要求走。