数据结构之图
最近要考试数据结构了,将图的相关知识点记录下,加强记忆。
1、概念:
(1)无向完全图:任意两个顶点之间都存在边,边数=n*(n-1)/2.
(2)有向完全图:任意两个顶点之间都存在方向互为相反的两条弧,边数=n*(n-1).
(3)路径的长度:路径的边或弧的数目。
2、图的存储结构:
用一维数组存储顶点,用二维数组存储边或弧的信息。
3、邻接矩阵
以节点名横向竖向生成二位表,横着看,分别由v0到v1、v2。。。。做记录,若两节点之间有边或者以v0为弧尾的弧,就记录1,否则记录0.如果是弧或边有权值,两节点无边或弧则记录无限大,有边或弧记录权值,自己对自己记录0.
4、邻接表
如果节点很多,而弧只有1条,那么邻接矩阵很多地方都记录0,浪费了大量的空间,所以引出了邻接表。
邻接表的方法是把某个节点的邻节点用链表串起来。比如v0,有v1,v2,连接着,则记录
0 v0 -> v1 -> v2 -> ^;
1 v1 ....
2 v2 ...
5、逆邻接表
由于邻接表只能方便查找以某个节点为弧尾的节点(出度),为了查找以它为弧头的节点(入度),所以有了逆邻接表。
将原节点弧的方向翻转,计算出邻接表,就是逆邻接表。
6、十字链表
将邻接表和逆邻接表的优点结合起来。具体略,估计不会考到。
7、图的遍历
(1)深度优先遍历(depth first search) DFS
类似树的前序遍历
思想:找到一个节点作为起始节点,然后找它最右手边的节点作为下个节点,一直找下去。如果下个右手边节点被访问过了,则回溯到上个节点,再找右手左一个的节点,依次类推,直到回溯到起始节点,完成遍历。
(2)广度优先遍历(breadth first search)
类似树的层次遍历
思想:找到一个节点作为起始节点,然后将其所有邻节点访问,再访问最右手边的节点的邻节点,直到所有节点的邻节点访问到。
8、最小生成树
概念:连接所有节点,代价最小
算法:
(1)普里姆算法(Prim)
(2)克鲁斯卡算法(kruskal)
9、最短路径
概念:A到B,路径最短。类似游戏里面的寻路算法了。
算法:
(1)迪杰斯特拉算法(Dijkstra)
(2)弗洛伊德算法(Floyd)
10、拓扑排序(Top)
用途:为了解决一个工程能否顺序进行。
算法:从AOV网中选取一个入度为0的顶点输出,然后删除此顶点和以此顶点为尾的弧,继续重复此步骤,直到全部顶点输出或者AOV网中不存在入度为0的顶点(说明是环)为止。
11、关键路径
用途:为了获取A到B顶点的最短时间
算法