图

图的存储结构
1. 图的邻接矩阵:
(1)图的邻接矩阵表示是唯一的。
(2)存储空间皆为O(n^2),所以适合用于稠密图。
(3)无向图的邻接矩阵一定对称。
(4)对于无向图,邻接矩阵数组的第i行(或第i列)非零元素、非∞元素的个数正好是顶点i的度。
(5)对于有向图,邻接矩阵数组的第i行(或第i列)非零元素、非∞元素的个数正好是顶点i的出度(或入度)。
(6)在需要提取边权值的算法中通常采用邻接矩阵存储结构。
2. 邻接表存储:
(1)表头数量=顶点数。
(2)对于无向图,边结点个数为边数的两倍;对于有向图,边结点个数等于边数。
(3)邻接表的表示不唯一。
(4)在需要提取某个顶点的所有邻接点的算法中通常采用邻接表存储结构。
图的遍历
1. 深度优先遍历(DFS):
从图中的某个初始点v出发,首先访问初始点v,然后选择一个于顶点v相邻且没被访问过的顶点w,以w为初始顶点,在从它出发进行深度优先遍历,直到图中于顶点v相邻的所有顶点都被访问过为止。
此过程为递归过程,总时间为O(n^2)
2. 广度优先算法(BFS):
首先访问初始点v,接着访问顶点v的所有未被访问过的邻接点v1,v2,...,vt,然后再按照v1,v2,...,vt的次序访问每一个顶点的所有未被访问过的邻接点,依此类推,直到图中所有和初始点v有路径相通的顶点都被访问过为止。
总时间为O(n^2)
最小生成树
1. 构造最小生成树的准则
(1)必须只使用该图中的边来构造最小生成树;
(2)必须使用且仅使用(n-1)条边来连接图中的n个顶点;
(3)不能使用产生回路的边。
2. 求解算法
(1)普里姆(Prim)算法:
将已经过的结点视为一个整体,取其整体周围的最短路径,并将其所连接的结点归入整体,继而重复,直至访问所有结点。
(2)克鲁斯卡尔(Kruskal)算法:
一直选择路径长度最短的(不可以选择会形成回路的路径),直至访问所有结点。
最短路径
1. 定义:
路径长度最短(即经过的边数最少)的那条路径称为最短路径。
2. 求解算法
(1)狄克斯特拉(Dijkstra)算法:
取顶点集合S,初始时S只包含源点,即S={v},源点到v到自己的距离为0.U包含除源点v以外的其他顶点;
从U中选取一个顶点u,取v到u的最短路径长度为最小,然后将顶点u加入S中;
以顶点u为新中间点,修改源点到其它各点的最短路径长度(即路径调整);
对于U中某个顶点j,在加入中间点u后,有多条路径使源点v连通j,取路径长度最小为最短路径;
重复上述步骤,直至S包含所有顶点。
(2)弗洛伊德(Floyd)算法:
把图用邻接矩阵G表示出来,如果从Vi到Vj有路可达,则G[i][j]=d,d表示该路的长度;否则G[i][j]=无穷大;
定义一个矩阵D用来记录所插入点的信息,D[i][j]表示从Vi到Vj需要经过的点,初始化D[i][j]=j;
把各个顶点插入图中,比较插点后的距离与原来的距离,G[i][j] = min( G[i][j], G[i][k]+G[k][j] ),如果G[i][j]的值变小,则D[i][j]=k;
在G中包含有两点之间最短道路的信息,而在D中则包含了最短通路径的信息
拓扑排序
1. AOV网:
用顶点表示活动,用有向边表示活动之间优先关系的有向图称为顶点顶点表示活动的网。
2. 排序方法:
选择一个没有前驱(即入度为0)的顶点并输出它,从图中删除该点,并删去从该顶点发出的全部有向边,重复上述步骤,直至剩余图中不再存在没有前驱的顶点为止。(可通过判断是否产生全部顶点的拓扑序列来确定该图中是否存在回路)
求AOE网的关键活动
假设事件x是源点、事件y是汇点
ve(v)为x到v所有路径长度的最大值;ve(y)为汇点y的最早开始时间;vl(v)为各顶点的最晚发生时间
e(i)为各边中ai活动的最早开始时间;l(i)为各边中ai活动的最晚开始时间(多种情况下,选择最小的)
求解公式
ve(x) = 0 ve(w) = MAX (所有存在<v,w>边的v){ve(v)+c(<v,w>)) w≠x
vl(y) = 0 vl(v) = MIN (所有存在<v,w>边的w){vl(w)-c(v,w)) v≠y
e(i) = ve(j) l(i) = vl(k)-dut(<i,k>)

浙公网安备 33010602011771号