图的存储
邻接矩阵表示法:用一个一维数组来存放顶点的信息,再用一个二维数组来存放边或弧的信息,又称为数组表示法
在邻接矩阵A中的任意一个元素aij,当aij为1或权值时表示ai与aj相关联(有边或弧相连接),0或无穷大时,ai与aj无关联(无边或弧相连)
邻接表与逆邻接表
十字链表
邻接多重表
图的遍历
深度优先搜索及其生成树
在图中任选一个出发点v访问;从顶点v邻接点中按指定顺序选择一个未曾访问过的顶点w作为新的出发点,继续进行深度优先搜索;若w的所有邻接点访问过,则回溯搜索,直到图中所有与v相通的顶点均被访问过为止。若此时图中仍有未被访问过的顶点,则另选一个顶点作为新的出发点,重复上述过程,直到全部访问完成。
广度优先搜索及其生成树
在图中任选一个出发点v访问;接着依次访问顶点v的所有邻接点,然后再分别指定v的每个邻接点作为出发点继续进行广度优先搜索,直到图中所有与v相通的顶点均被访问过为止。若此时图中仍有未被访问过的顶点,则另选一个顶点作为新的出发点,重复上述过程,直到全部访问完成。
最小生成树
MST性质
假设N=(V,E)是一个连通网,U是顶点集V的一个非空子集。若(u,v)是一条具有最小权值(代价)的边,u属于V,v属于V-U,则必存在一颗包含边(u,v)的最小生成树。
Kruskal算法
按权值的递增次序选择合适的边来建立最小生成树的方法。首先建立n个顶点的零图;将e条边按权值升序排列;每次从权值序列中选出最小权值所对应的边,若添加到图中不构成回路,则将该边加入图中;反复进行直到已添加n-1条边为止。
Prim算法
通过加入最小邻接边的方法来建立最小生成树。首先构造一个零图,再选一个初始顶点加入到集合U中,然后分别从集合U和V-U中各选一个顶点,使得构成的边为权值最小的,将该边添加到图中,同时将该边上对应于集合V-U的顶点并入到集合U中,重复此过程直到U==V为止。
图的应用
拓扑排序
一个有向图可以代表一个施工流程图或一个数据处理流程图,这时它的顶点表示活动,有向边表示活动的先后顺序,称为顶点表示活动的网,简称AOV网。
AOV网不能有回路,否则工程无法正常进行,称为死锁。
如果一个AOV网没有回路,那么它的顶点一定能排成一个序列,对没有边相连的顶点人为地规定一种先后顺序,使得任意有向边的始点和终点在这个序列中依然保持先后顺序,称这样的序列为拓扑序列。在有向图中寻找拓扑序列的过程就是拓扑排序。步骤如下:
1.从AOV网中选择一个入度为0的顶点并输出。
2.从AOV网中删除此结点及其相连的弧。
3.重复12,直到AOV网中没有入度为0的顶点为止。如果此时AOV网非空,则说明其中必有回路,无法得到拓扑序列。
如果在排序过程中出现了多个入度为0的顶点,此时可任选一个顶点,所以一个有向图的拓扑序列可能不唯一。
关键路径
一个有向图可以用来估算工程的计划完成时间,这时它的顶点表示事件,边表示活动,边上权值表示活动持续的时间。顶点表示“其入边所代表的活动已完成,出边所代表的活动可以开始”这样一种状态,称为事件。这样的有向图称为边表示活动的网。简称AOE网。AOE网不能有回路,而且只能有一个入度为0的顶点(源点)和一个出度为0的顶点(汇点)。
从源点到汇点最长的带权路径称为关键路径,关键路径的带权长度是完成整个工程的最短时间。关键路径上的活动称为关键活动
事件最早发生时间是从源点到该结点的最长带权路径长度。
事件最迟发生时间等于汇点最早发生时间减去该顶点到汇点的最长带权路径长度。
最短路径
Dijkstra算法
按路径长度递增的方法计算某一点到其余各点的最短距离。
其基本思想为:将当前路径长度下计算出来的最短路径用于下一次路径长度增1时的最短路径计算当中。
算法规则:将起始点插入树中,将树种所有该顶点的邻接边进行比较,找出权值总和最小的边,将对应的顶点插入树中,重复直到所有的顶点都在树中为止。