图论的基本算法.ppt
《图论的基本算法.ppt》由会员分享,可在线阅读,更多相关《图论的基本算法.ppt(49页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、图论的基本算法 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望图n图的概念G=(V,E)n图的基本概念n有向图、顶点、入度、出度、弧、环n无向图、边、路径、顶点的度、邻接n简单图、完全图n平面图、二分图图的存储结构n邻接矩阵邻接矩阵 graph=Record vex:array1.vtxptr of vertex;arc:arrayvtxptr,vtxptr of vertex;n邻接表邻接表 表节点表节点 type arcptr=arcnode;arcnode=
2、record adjvex:vtxptr;nextarc:arcptr;info:和弧有关的其他信息和弧有关的其他信息 end;vex=Record vexdata:和顶点有关的其他信息和顶点有关的其他信息 firstarc:arcptr;end;adjlist=array vtxptr of vexnode;拓扑排序n网线从机房连接到办公室n在机房,所有网线从左到右编号为1,2,3,N n给出每两条线是否交叉的信息,请计算办公室内从左到右各条线的编号 nFUNC toporder(var dig:adjlisttp):boolean;n init(top2);m:=0;ve1.n:=0n w
3、hile Not empty(top1)do n j:=pop(top1);push(top2,j);m:=m+1;n k:=firstadj(dig,j);n while k0 do n 入度(k):=入度(k)1;n if 入度(k)=0 then push(top1,k);n if vej+dut()vek then vek:=vej+dut();n k:=nextadj(dig,j,k)n n n if m0时时n以该顶点为开始或结束的针数以该顶点为开始或结束的针数=Kn可以恰好为可以恰好为K针针所有所有K值加起来,除以值加起来,除以2(每一针有两个端点)(每一针有两个端点)n注意差值
4、为注意差值为0时,为时,为1针而不是针而不是0针针最小生成树问题n要求连接所有岛屿n电缆总长度尽量小Prim算法n任意时刻的中间结果都是一棵树任意时刻的中间结果都是一棵树从一个点开始从一个点开始每次都花最小的代价,用一条加进一个新点每次都花最小的代价,用一条加进一个新点n问题:问题:这样做是对的吗?这样做是对的吗?如何快速找到这个如何快速找到这个“最小代价最小代价”?Prim算法的正确性n换一种说法换一种说法如果存在一个如果存在一个MST,包含当前所有边,包含当前所有边则也存在一个则也存在一个 MST,它包含最小代价边它包含最小代价边(u,v)n反证法!反证法!假设存在这样的假设存在这样的MS
5、T当前结点集为当前结点集为S,剩下的结点集为,剩下的结点集为T由于在由于在MST中中S-T连通连通n一定有跨越一定有跨越S-T的某边的某边(u,v)n它不是最小代价边它不是最小代价边(u,v)n删除删除(u,v),加入,加入(u,v),S和和T分别连通,且分别连通,且S-T通过通过(u,v)连通连通n得到了一个更小的得到了一个更小的MST!快速找到最小代价n需要借助数据结构!需要借助数据结构!n我们的算法要求我们的算法要求快速取快速取/删除最小值(边权)删除最小值(边权)允许插入边(加入新点时插入它的关接边)允许插入边(加入新点时插入它的关接边)抽象数据类型:优先队列!抽象数据类型:优先队列!
6、n经典实现:堆!经典实现:堆!Prim算法框架初始化,树仅含一个任意一点v0把v0的邻边插入堆for i:=1 to n1 dobegin 从堆中取出最小值,设边为(u,v),v为新点 (u,v)加入生成树中 v和它所有不在树中的邻居组成的边插入堆end;每次取最小值为O(logm)总时间复杂度为O(nlogm)Kruskal算法n任意时刻的中间结果是一个森林从n个点的集合开始每次选不产生圈的前提下权最小的边加入n问题:这样做是对的吗?如何快速的判断是否产生圈Kruskal算法的正确性n把一个二元组(E,I)叫做一个子集系统,如果满足:1E是一个非空集合2I是E的一个子集族,它在包含运算下封闭
7、,即I的每个元素a都是E的一个子集,并对于a的任何子集a,a一定也是I的元素。3给E中每个元素e赋予一个正权w(e)。n考虑至少有一条边的带权无向连通图G它的边集为E它的所有生成森林的集合为I则(E,I)是一个子集系统,称为生成森林子集系统nE非空,所以满足条件1n生成森林是E的一个边集,而且其生成子图仍是生成森林,满足2nG是带权的,所以满足3。子集优化问题n极大独立集把I中的元素都称为独立集对于I中的元素a,如果不存在I中的另一个元素a使得a是a的真子集,则称a是极大独立集。该极大独立集的基数为它包含的元素个数n在刚才介绍的子集系统中,G的所有生成树就是所有的极大独立集。所有极大独立集具有
8、相同的基数|V|1。其中|V|为G的顶点数。n子集优化问题在子集系统(E,I)中选取一个元素SI,使得w(S)最大(定义w(S)为S中所有元素的权和)子集优化问题的贪心算法n贪心算法先把E中元素按照权值从大到小排序为e1,e2,令集合S=空集然后每次尝试着把e1,e2,,添加到S里面n如果添加之后S仍是独立集,则添加成功n如果S不是独立集,则由定义知以后无论怎样继续添加元素,得到的集合都不可能重新成为独立集,因此撤消此添加操作。nKruskal算法是生成森林子集系统的贪心算法!贪心算法在什么子集系统下是的对的呢?n定理贪心算法正确,当且仅当这个系统的极大独立集具有相同的基数满足条件的子集系统称
9、为“矩阵胚(matroid)”快速判断是否产生圈n需要借助数据结构!n我们的算法要求判断两个点是否在同一棵树中n产生圈当且仅当此边连接同一树中的点!快速把两棵树合并n加边意味着两棵树合为一棵抽象数据类型:并查集!n经典实现:森林n并查集的森林实现森林中的每棵树表示不同的集合树的形态并不重要,有意义的只是“哪些元素在树中”并查集的操作n查找用树根作为集合的标识不断的找父亲,最终将找到树根n要找多少次父亲?和树的高度有关!n怎样减少树的高度?找到树根后沿途把路径上的结点的父亲设为根专门名称:路径压缩两元素所在的树根相同,则二者属于同一集合n合并其中一棵树成为另一棵树树根的子树谁成为谁的子树?注意树
10、的高度!n启发式合并n时间复杂度:几乎都为常数!并查集的实现n回忆刚才用到了什么信息?查找:“不断的找父亲”“沿途设置结点的父亲为树根”合并:“把一棵树的父亲设置为另一棵树的树根”只有“父亲”信息!n父亲表示法!father:array1.maxn of integer;根结点root满足fatherroot:=root查找:while fatherp p do p:=fatherp;?合并:if height(p1)height(p2)then fatherp1:=p2Kruskal算法框架把所有边按照权值从小到大排序为e1,e2,初始化n个集合,Si=isize:=0;for i:=1 t
11、o m do if ei的两个端点u,v不在同一个集合 then begin 合并Su和Sv inc(size);if size=n 1 then break;end;n最坏情况循环执行m次,判断约O(1)n如果输入已经排序好,则总时间复杂度为O(m),否则为O(mlogm)最短路问题n问题描述:给加权图GSSSP:求给定起点s到其他所有点的最短路APSP:求每两对点的最短路n算法标号设定类:dijkstra标号修正类:bellmanford动态规划类:floydwarshall变形与应用举例SSSP(Dijkstra算法)n核心思想:按路径递增的次序产生最短路径的算核心思想:按路径递增的次序
12、产生最短路径的算法法 1)找到图中最短的路径,设为(找到图中最短的路径,设为(v,vj),将将j设为已设为已标号的点标号的点 2)找下一条次短的路径,假设终点为找下一条次短的路径,假设终点为k,将将k设为已设为已标号的点标号的点,那么要么是(那么要么是(v,vk)要么是()要么是(v,vj,vk),若经过若经过vj,将将j设为已检查的点设为已检查的点,放入集合放入集合.3)以次短路径出发找第三短的路径以次短路径出发找第三短的路径,类似第二步的类似第二步的方法方法.4)按上述方法一直到所有的顶点被检查过按上述方法一直到所有的顶点被检查过,则从则从v到到其他顶点的最短路径求出其他顶点的最短路径求出
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基本 算法
限制150内