1.什么是图?图(Graph)是表示物件与物件之间的关系的数学对象

           图,是一种比树更为复杂的数据结构。树的节点之间是一对多的关系,并且存在父与子的层级划分;而图的顶点(注意,这里不叫节点)之间是多对多的关系,并且所有顶点都是平等的,无所谓谁是父谁是子。

           在图中,最基本的单元是顶点(vertex),相当于树中的节点。顶点之间的关联关系,被称为边(edge)。边上被赋予一定的值,代表代价,称为权重,这样的图成为带权图

           顶点之间的边就有了方向的区分,这种带有方向的图被称为有向图

 

2.图的几种存储方式:

 

2.1.邻接矩阵

     无向图

                         

数据结构《图》_链表

注意:无向图邻接矩阵一定是对称的

    有向图

                         

数据结构《图》_链表_02

注意:邻接矩阵的存储方法简单直观,可以迅速查到一个顶点和另一定点的关系;但是,由于每个顶点都需要存储关系,n个顶点至少需要n^2的数组,当只有部分点有关联时,浪费了存储空间。

2.2.邻接表和逆邻接表

                         

数据结构《图》_链表_03

        邻接表中,每个顶点都是一个链表的头节点,其后连接着该顶点能够直接到达的相邻顶点。如:想找到0是否能到达节点1,需要遍历节点,从0开始,向后即可,也能找到0所到达的所有相邻节点。

邻接表形势的存储结构,可以解决临界矩阵的空间占用问题。

但是,想要查出哪些节点可以到达节点1,就需要重新遍历,然后看是否可以在邻接表中找到,最后发现0和3号节点都可以到达。但是这样的查询又需要遍历,于是采用上逆邻接表来解决。

                        

数据结构《图》_邻接表_04

逆邻接表每一个顶点作为链表的头节点,后继节点存储能够直接到达该顶点的相邻顶点。

     总结来看

                       

数据结构《图》_邻接表_05

2.3.十字链表

结构包括

                        

数据结构《图》_邻接矩阵_06

入弧和出弧:入弧是发出箭头的顶点,出弧是箭头指向的顶点。

弧头和弧尾:弧尾表示发出箭头的顶点,弧头表示箭头指向的顶点。

                        针对该图:

                                                            

数据结构《图》_链表_07

画十字链表的方法:

1.先画出邻接表

数据结构《图》_邻接矩阵_08

2.连线(相当于画出逆邻接表)

数据结构《图》_邻接表_09

逆邻接表画法比较复杂,简单来说分两步即可。

总结:

        图片前两个参考​​https://mp.weixin.qq.com/s/FGwRyNAIr1VFzcV4IUOgSA​​,后面visio绘图作为补充

        图分为有向图,无向图,根据是否带权,分为带权图和无权图。

        图的几种存储方式要理解:邻接矩阵,邻接表,逆邻接表,十字链表。