数据结构 图
图是一种比线性表和树更复杂的数据结构,
在图中,结点之间的关系是任意的,任意两个数据元素之间都可能相关。图是一种多对多的数据结构。
概述
概念:
图(Graph):
由顶点的有穷非空集合和顶点之间边的集合组成。
通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。
注意:线性表和树中可以没有元素;而在图中可以没有边,但是不允许没有顶点,。
网:
带有权重的图
环:
第一个顶点和最后一个顶点相同的路径;
基本术语:
无向边:
若顶点Vi和Vj之间的边没有方向,称这条边为无向边(Edge),用(Vi,Vj)来表示。
有向边/弧(Arc):
若从顶点Vi到Vj的边有方向,称这条边为有向边。
用<Vi, Vj>来表示,其中Vi称为弧尾(Tail),Vj称为弧头(Head)。
权(Weight):
表示从图中一个顶点到另一个顶点的距离。
度:
与顶点相连接的边数;
出度、入度:
有向图中的概念,出度表示以此顶点为起点的边的数目,入度表示以此顶点为终点的边的数目;
图的分类:
按边的类型分类:
-
无向图(Undirected graphs): 图中任意两个顶点的边都是无向边。
-
有向图(Directed graphs): 图中任意两个顶点的边都是有向边。
按边的数量分类:
稀疏图与稠密图:
有很少条边或弧的图称为稀疏图,反之称为稠密图。
按有无环分类:
- 简单图: 不存在自环(顶点到其自身的边)和重边(完全相同的边)的图
- 简单环: 除去第一个顶点和最后一个顶点后没有重复顶点的环;
其他图的分类:
-
无向完全图: 无向图中,任意两个顶点之间都存在边。
-
有向完全图:有向图中,任意两个顶点之间都存在方向相反的两条弧。
-
连通图:任意两个顶点都相互连通的图;
极大连通子图:
包含竟可能多的顶点(必须是连通的),即找不到另外一个顶点,使得此顶点能够连接到此极大连通子图的任意一个顶点;
连通分量:
极大连通子图的数量;
强连通图:
此为有向图的概念,表示任意两个顶点a,b,使得a能够连接到b,b也能连接到a 的图;
储存结构
常用的有:邻接表和邻接矩阵,十字链表
遍历方式
图的遍历通常有两种方法:深度优先遍历和广度优先遍历。
最小生成树(ST)
最短路径
概念:
最短路径:
网中,最短路径是指两个顶点之间经过的边上权值之和最少的路径。
与最小生成树不同,路径上不一定有n个结点,也不一定包含n-1条边
源点:
路径上的第一个顶点。
终点:
路径上的最后一个顶点。
计算最短路径算法:
迪杰斯特拉(Djikstra)算法:单源最短路
佛洛伊德(Floyd)算法: 所有顶点间的最短路径
Djikstra算法
注意:我们不考虑负值圈(边的权值为负数)
迪杰斯特拉算法
作用:
求出单源点最短路径。
也就是能求出任意两个顶点之间的最短路径。(如果有)
思想:
- 初始时,S只包含源点,即S={v},v的距离为0。U包含除v外的其他顶点,即:U={其余顶点},若v与U中顶点u有边,则<u,v>正常有权值,若u不是v的出边邻接点,则<u,v>权值为∞。
- 从U中选取一个距离v最小的顶点k,把k,加入S中(该选定的距离就是v到k的最短路径长度)。
- 以k为新考虑的中间点,修改U中各顶点的距离;若从源点v到顶点u的距离(经过顶点k)比原来距离(不经过顶点k)短,则修改顶点u的距离值,修改后的距离值的顶点k的距离加上边上的权。
- 重复步骤b和c直到所有顶点都包含在S中。
Floyd算法
佛洛伊德算法
作用:
所有顶点间的最短路径;
也就说运行一般算法后,任意两个顶点的最短路便就直到了。
思想:
我们知道:从任意节点A到任意节点B的最短路径只有两种情况:
- 1是直接从A到B
- 2是从A经过若干个节点到B。
所以我们只需要将所有情况的中间路径遍历一边,取
dist[i][j] =min( dist[i][j] ,dist[i][k] + dist[k][j] );
即可。
拓扑排序
概述
拓扑序列
在AOV网中,若不存在回路,(有向无环图)
则所有活动可排列成一个线性序列,
使得每个活动的所有前驱活动都排在该活动的前面,我们把此序列叫做拓扑序列。
思想:
- 预处理得到每个点的入度
- 执行入度为 0 的点(没有前驱),放入一个待执行的容器,在图中删除,
- 删除在图中以他为弧尾的弧删除。
- 重复上面两步,直到所有顶点均输出/途中不存在无前驱的顶点。
- 如果排序后,还剩下部分点,说明图中有环
- 所有顶点均输出,则图中无环。
关键路径
概述:
AOE网(Activity On Edge Network)
把工程计划表示为边表示活动的网。
用顶点表示事件,弧表示活动,弧的权表示活动的持续时间。
常用来估算工程的时间。
事件:
表示在它之前的活动已经完成,在它之后的活动可以开始。
路径长度:
路径上各个活动所持续的事件之和。
关键路径:
从源点到终点具有最大长度的路径。
关键路径可能不止一条
关键活动:
在关键路径上的活动。
Ve(j):是指从始点开始到顶点Vj的最大路径长度
Vl(j):在不推迟整个工期的前提下,事件vj允许的最晚发生时间
e(i): 若活动ai由弧<vk,vj>表示,则活动ai的最早开始时间应该等于事件vk的最早发生时间。因而,有:e(i)=ve(k);(即:边(活动)的最早开始时间等于,它的发出顶点的最早发生时间)
思想:
- 先根据首结点的Ve(j)=0由前向后计算各顶点的最早发生时间
- 再根据终结点的Vl(j)等于它的Ve(j)由后向前依次求解各顶点的最晚发生时间
- 根据边的e(i)等于它的发出顶点的Ve(j)计算各边的最早开始时间(最早开始,对应最早发生)
- 根据边的l(i)等于它的到达顶点的Vl(j)减去边的权值计算各边的最晚开始时间(最晚开始,对应最晚发生)