图各种算法(深度、广度等)_第1页
图各种算法(深度、广度等)_第2页
图各种算法(深度、广度等)_第3页
图各种算法(深度、广度等)_第4页
图各种算法(深度、广度等)_第5页
已阅读5页,还剩67页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

图算法 从图中某个顶点V0出发 访问此顶点 然后依次从V0的各个未被访问的邻接点出发深度优先搜索遍历图 直至图中所有和V0有路径相通的顶点都被访问到 一 深度优先搜索遍历图 连通图的深度优先搜索遍历 深度遍历 V1 V2 V4 V8 V5 V6 V3 V7 W1 W2和W3均为V的邻接点 SG1 SG2和SG3分别为含顶点W1 W2和W3的子图 访问顶点V for W1 W2 W3 若该邻接点W未被访问 则从它出发进行深度优先搜索遍历 从上页的图解可见 1 从深度优先搜索遍历连通图的过程类似于树的先根遍历 解决的办法是 为每个顶点设立一个 访问标志visited w 2 如何判别V的邻接点是否被访问 6 DFS算法框架 递归写法 较常用 DFS NODEN FORN的每一个邻接结点V IF V还没有被搜索过 DFS V voidDFS GraphG intv 从顶点v出发 深度优先搜索遍历连通图Gvisited v TRUE VisitFunc v for w FirstAdjVex G v w 0 w NextAdjVex G v w if visited w DFS G w 对v的尚未访问的邻接顶点w 递归调用DFS DFS 二 广度优先搜索遍历图 对连通图 从起始点V到其余各顶点必定存在路径 其中 V w1 V w2 V w8的路径长度为1 V w7 V w3 V w5的路径长度为2 V w6 V w4的路径长度为3 w1 V w2 w7 w6 w3 w8 w5 w4 从图中的某个顶点V0出发 并在访问此顶点之后依次访问V0的所有未被访问过的邻接点 之后按这些顶点被访问的先后次序依次访问它们的邻接点 直至图中所有和V0有路径相通的顶点都被访问到 若此时图中尚有顶点未被访问 则另选图中一个未曾被访问的顶点作起始点 重复上述过程 直至图中所有顶点都被访问到为止 广度遍历 V1 V2 V3 V4 V5 V6 V7 V8 11 BFS算法框架 迭代写法 BFS NODEN 把N加入到队列中 while 队列非空 当前结点N 队头结点 标记N已经搜索过了 FORN的每一个邻接结点V IF V还没有被搜索过 将V加入到队列中 voidBFSTraverse GraphG Status Visit intv for v 0 v G vexnum v visited v FALSE 初始化访问标志InitQueue Q 置空的辅助队列Qfor v 0 v G vexnum v if visited v v尚未访问 BFSTraverse visited v TRUE Visit v 访问uEnQueue Q v v入队列while QueueEmpty Q DeQueue Q u 队头元素出队并置为ufor w FirstAdjVex G u w 0 w NextAdjVex G u w if visited w visited w TRUE Visit w EnQueue Q w 访问的顶点w入队列 if while AOV网 用顶点表示活动 用弧表示活动间优先关系的有向图称为顶点表示活动的网 ActivityOnVertexnetwork 简称AOV网若是图中有向边 则vi是vj的直接前驱 vj是vi的直接后继AOV网中不允许有回路 因为存在环意味着某项活动以自己为先决条件拓扑排序的方法在有向图中选一个没有前驱的顶点且输出之从图中删除该顶点和所有以它为尾的弧重复上述两步 直至全部顶点均已输出 或者当图中不存在无前驱的顶点为止 三 拓扑排序 a b h c d g f e 在算法中需要用定量的描述替代定性的概念 没有前驱的顶点 入度为零的顶点 删除顶点及以它为尾的弧 弧头顶点的入度减1 算法实现以邻接表作存储结构把邻接表中所有入度为0的顶点进栈栈非空时 输出栈顶元素Vj并退栈 在邻接表中查找Vj的直接后继Vk 把Vk的入度减1 若Vk的入度为0则进栈重复上述操作直至栈空为止 若栈空时输出的顶点个数不是n 则有向图有环 否则 拓扑排序完毕 邻接表结点 typedefstructnode intvex 顶点域structnode next 链域 JD 表头结点 typedefstructtnode intin 入度域structnode link 链域 TD TDg M g 0 不用 算法描述 1 6 输出序列 6 输出序列 6 输出序列 6 输出序列 6 输出序列 6 输出序列 6 输出序列 61 输出序列 61 输出序列 61 4 输出序列 61 4 输出序列 61 4 输出序列 61 4 3 输出序列 61 4 3 输出序列 61 4 3 输出序列 61 4 3 输出序列 61 4 3 输出序列 613 4 3 输出序列 613 4 输出序列 613 4 输出序列 613 4 输出序列 613 4 2 输出序列 613 4 2 输出序列 613 4 2 输出序列 6132 4 2 输出序列 6132 4 输出序列 61324 4 输出序列 61324 输出序列 61324 5 输出序列 61324 5 输出序列 613245 5 输出序列 613245 49 拓扑排序算法框架 StatusTopologicalOrder ALGraphG Stack TopologicalOrder 构造网的一棵最小生成树 即 在e条带权的边中选取n 1条边 不构成回路 使 权值之和 为最小 算法二 克鲁斯卡尔算法 算法一 普里姆算法 四 最小生成树 构造最小生成树方法方法一 普里姆 Prim 算法算法思想 设N V E 是连通网 TE是N上最小生成树中边的集合初始令U u0 u0 V TE 在所有u U v V U的边 u v E中 找一条代价最小的边 u0 v0 将 u0 v0 并入集合TE 同时v0并入U重复上述操作直至U V为止 则T V TE 为N的最小生成树算法实现 图用邻接矩阵表示 例如 a e d c b g f 14 8 5 3 16 21 所得生成树权值和 14 8 3 5 16 21 67 在生成树的构造过程中 图中n个顶点分属两个集合 已落在生成树上的顶点集U和尚未落在生成树上的顶点集V U 则应在所有连通U中顶点和V U中顶点的边中选取权值最小的边 一般情况下所添加的顶点应满足下列条件 设置一个辅助数组 对当前V U集中的每个顶点 记录和顶点集U中顶点相连接的代价最小的边 struct VertexTypeadjvex U集中的顶点序号VRTypelowcost 边的权值 closedge MAX VERTEX NUM a e d c b a a a 19 14 18 14 例如 e 12 e e 8 16 8 d 3 d d 7 21 3 c 5 5 Prim算法框架 voidMiniSpanTree P MGraphG VertexTypeu 用普里姆算法从顶点u出发构造网G的最小生成树k LocateVex G u for j 0 j G vexnum j 辅助数组初始化if j k closedge j u G arcs k j adj closedge k lowcost 0 初始 U u for i 0 i G vexnum i k minimum closedge 求出加入生成树的下一个顶点 k printf closedge k adjvex G vexs k 输出生成树上一条边closedge k lowcost 0 第k顶点并入U集for j 0 j G vexnum j 修改其它顶点的最小边if G arcs k j adj closedge j lowcost closedge j G vexs k G arcs k j adj 具体做法 先构造一个只含n个顶点的子图SG 然后从权值最小的边开始 若它的添加不使SG中产生回路 则在SG上加上这条边 如此重复 直至加上n 1条边为止 考虑问题的出发点 为使生成树上边的权值之和达到最小 则应使生成树中每一条边的权值尽可能地小 克鲁斯卡尔算法的基本思想 a e d c b g f 14 8 5 3 16 21 例如 7 12 18 19 Kruskal算法框架 构造非连通图ST V k i 0 k计选中的边数while k n 1 i 检查边集E中第i条权值最小的边 u v 若 u v 加入ST后不使ST中产生回路 则输出边 u v 且k 普里姆算法 克鲁斯卡尔算法 时间复杂度 O n2 O eloge 稠密图 稀疏图 算法名 适应范围 比较两种算法 从图中某个顶点V0出发 访问此顶点 然后依次从V0的各个未被访问的邻接点出发深度优先搜索遍历图 直至图中所有和V0有路径相通的顶点都被访问到 五 最短路径 连通图的深度优先搜索遍历 求最短路径的迪杰斯特拉算法 一般情况下 Dist k 或者 设置辅助数组Dist 其中每个分量Dist k 表示当前所求得的从源点到其余各顶点k的最短路径 1 在所有从源点出发的弧中选取一条权值最小的弧 即为第一条最短路径 2 修改其它各顶点的Dist k 值 假设求得最短路径的顶点为u 若Dist u G arcs u k Dist k 则将Dist k 改为Dist u G arcs u k V0和k之间存在弧 V0和k之间不存在弧 其中的最小值即为最短路径的长度 Dijkstra算法的迭代过程 Dijkstra算法框架 voidShortestPath DIJ MGraphG intv0 PathMatrix 初始化 v0顶点属于S集 66 开始主循环 每次求得v0到某个v顶点的最短路径 并加v到S集 for i 1 i G vexnum i 其余G vexnum 1个顶点min INFINITY 当前所知离v0顶点的最近距离for w 0 w G vexnum w if final w w顶点在V S中if D w min v w min D w w顶点离v0顶点更近final v TRUE 离v0顶点最近的v加入S集for w 0 w G vexnum w 更新当前最短路径及距离if final w P w P v w if for ShortestPath DIJ Floyd算法 假设图中的顶点为v1 v2 vn 则顶点vi到顶点vj的最短路径中间可能经过的顶点有v1 v2 vn 设dij k 等于从第顶点vi到顶点vj的每个中间顶点编号不大于k的所有路径的最短路径长度所有这些路径分成两个不相交的子集 一个子集中的路径不把vk作为中间顶点 一个子集反之 Floyd sAlgorithm观念图解 求矩阵Dk i j 是由矩阵Dk 1 i j 而来递归式 69 当k 0时 矩阵D0 i j 表示为AdjacencyMatrix 相邻矩阵 W 自vi至vj途中不会经过其它顶点Floyd sAlgorithm求解过程 找出相邻矩阵W逐步求出D1 D2 Dn矩阵Dn矩阵即为结果 求解右图的Al

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论