第七章 图
图的定义和术语
图、顶点、边、有向图、弧、无向图、有向完全图、无向完全图、相邻顶点、相关联弧或边 、度、子图、路径、图的连通->连通图->连通分量->强连通图->强连通分量、带权图、网
图的存储结构
图的数组存储表示(邻接矩阵)
原理:两个数组->二位数组存储结点的两条边的信息、一维数组存储结点值
特点:有向图邻接矩阵不是对称的、无向图的邻接矩阵是对称的
图的邻接表存储表示
邻接表:
每个结点有三个域组成:邻接结点域->指示与顶点vi邻接的点在图中的位置,链域->指示下一条边或弧的结点,数据域->存储与边相关的信息,如权值等。
每个链表需要附设一个表头结点,在表头结点中,除了设有链域指向链表中第一个结点之外,还设有存储顶点vi的名或者其他有关信息的数据域。
可以建立一个逆邻接表,即从入度的角度看
在邻接表中容易找到任一顶点的第一个邻接点和下一个邻接点,但是要判定任意两个顶点之间是否有边或者弧相连,则需要搜索第i或第j个链表,因此不及邻接矩阵方便。
有向图的十字链表存储表示
无向图的邻接多重表存储表示
图的遍历
深度优先搜索:顶点编号从小到大,依次访问当前顶点、下一个未被访问的顶点
广度优先遍历:顶点编号从小到大,依次访问当前顶点,长度为1、2、3……的顶点
最小生成树
普利姆算法
从任意一个顶点出发->依次在与此顶点相连的顶点中找权值最小的一条边->把此顶点包含在树里->重复上述操作:每次往生成树里加一个顶点和一条权值最小的边。
时间复杂度:o(n^2) n代表有n个顶点,与网中的边数无关,因此只适于求解稠密的网的最小生成树。
克鲁斯卡尔算法
从边的最小权值出发->依次寻找权值逐渐增大的边->把边与顶点均加入树中
时间复杂度:0(eloge)e代表边数,与网中的顶点数无关,因此只适于求边稀疏的网的最小生成树。
拓扑排序
引入:实际例子->aov图(顶点表示活动,弧表示活动间的优先关系的有向图称为顶点表示活动的图)
构建:将aov网络中各顶点按照它们相互之间的优先关系排列成一个线性序列的过程叫拓扑排序
步骤:1、在有向图中选一个没有前驱的顶点并且输出 2、从图中删除该顶点和所有以它为尾的弧 3、重复上述两步,直至全部顶点输出或者当前图中不存在无前驱的顶点为止。
关键路径
路径长度最长的路径叫关键路径
最短路径
各边上权值之和最小的一条路径
构造最短路径:迪杰斯特拉算法
思想:按照路径长度递增的次序产生最短路径的算法,具体而言是把顶点分为两类,第一组是已经确定放入最短路径的顶点,第二组是不确定是否要放入最短路径的顶点,按照最短路径递增的顺序将顶点放入第一组种,直至从v0出发的所有的顶点均放入第一类的顶点中。注:确保从v0出发到第一组的顶点的最短路径小于到第二组的顶点的最短路径
具体步骤:
提出问题:人们总想知道从源点到某一顶点为终点的最短路径
法一:将图中的每个顶点作为源点重复迪杰斯特拉算法即可
法二:弗洛伊德算法 :逐个顶点试探
弗洛伊德算法: