1.什么是图?图(Graph)是表示物件与物件之间的关系的数学对象
图,是一种比树更为复杂的数据结构。树的节点之间是一对多的关系,并且存在父与子的层级划分;而图的顶点(注意,这里不叫节点)之间是多对多的关系,并且所有顶点都是平等的,无所谓谁是父谁是子。
在图中,最基本的单元是顶点(vertex),相当于树中的节点。顶点之间的关联关系,被称为边(edge)。边上被赋予一定的值,代表代价,称为权重,这样的图成为带权图。
顶点之间的边就有了方向的区分,这种带有方向的图被称为有向图
2.图的几种存储方式:
2.1.邻接矩阵
无向图
注意:无向图邻接矩阵一定是对称的
有向图
注意:邻接矩阵的存储方法简单直观,可以迅速查到一个顶点和另一定点的关系;但是,由于每个顶点都需要存储关系,n个顶点至少需要n^2的数组,当只有部分点有关联时,浪费了存储空间。
2.2.邻接表和逆邻接表
邻接表中,每个顶点都是一个链表的头节点,其后连接着该顶点能够直接到达的相邻顶点。如:想找到0是否能到达节点1,需要遍历节点,从0开始,向后即可,也能找到0所到达的所有相邻节点。
邻接表形势的存储结构,可以解决临界矩阵的空间占用问题。
但是,想要查出哪些节点可以到达节点1,就需要重新遍历,然后看是否可以在邻接表中找到,最后发现0和3号节点都可以到达。但是这样的查询又需要遍历,于是采用上逆邻接表来解决。
逆邻接表每一个顶点作为链表的头节点,后继节点存储能够直接到达该顶点的相邻顶点。
总结来看
2.3.十字链表
结构包括
入弧和出弧:入弧是发出箭头的顶点,出弧是箭头指向的顶点。
弧头和弧尾:弧尾表示发出箭头的顶点,弧头表示箭头指向的顶点。
针对该图:
画十字链表的方法:
1.先画出邻接表
2.连线(相当于画出逆邻接表)
逆邻接表画法比较复杂,简单来说分两步即可。
总结:
图片前两个参考https://mp.weixin.qq.com/s/FGwRyNAIr1VFzcV4IUOgSA,后面visio绘图作为补充
图分为有向图,无向图,根据是否带权,分为带权图和无权图。
图的几种存储方式要理解:邻接矩阵,邻接表,逆邻接表,十字链表。