图论的基本算法及应用精品文稿.ppt
《图论的基本算法及应用精品文稿.ppt》由会员分享,可在线阅读,更多相关《图论的基本算法及应用精品文稿.ppt(60页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、图论的基本算法及应用第1页,本讲稿共60页NOIP若干图论的考题Core(2007)Core(2007):图的多源最短路算法及其简单图的多源最短路算法及其简单处理处理双栈排序双栈排序(2008):栈的应用栈的应用+二分图的搜索二分图的搜索最优贸易最优贸易(2009):基本图论基本图论第2页,本讲稿共60页关于图论的基本问题图的基本概念及其存储结构(邻接矩阵和邻接表)图的基本概念及其存储结构(邻接矩阵和邻接表)图的遍历(深度优先和宽度优先遍历)图的遍历(深度优先和宽度优先遍历)图的连通性问题(求连通分量和强连通分量,关键节点)图的连通性问题(求连通分量和强连通分量,关键节点)有向无环图的拓扑序列
2、有向无环图的拓扑序列特殊图(偶图和一笔画问题、二分图和匹配问题)特殊图(偶图和一笔画问题、二分图和匹配问题)图的最小生成树及其应用图的最小生成树及其应用图的最短路问题图的最短路问题单源最短路(单源最短路(DIJKSTRA算法,算法,BELLMAN算法,算法,SPFA算法)算法)任意两点的最短路(任意两点的最短路(FLOYD算法)算法)第3页,本讲稿共60页一个简单问题一摆渡人欲将一只狼一摆渡人欲将一只狼,一头羊一头羊,一篮菜从河一篮菜从河西渡过河到河东西渡过河到河东.由于船小由于船小,一次只能带一一次只能带一物过河,并且狼与羊物过河,并且狼与羊,羊与菜不能独处羊与菜不能独处.给出渡河方法给出渡
3、河方法.第4页,本讲稿共60页 解解:用四维:用四维0-10-1向量表示向量表示(人人,狼狼,羊羊,菜菜)在河西岸的状态在河西岸的状态(在河西岸则分量取在河西岸则分量取1,1,否则取否则取0),0),共有共有24=16 种状态种状态.在河东岸在河东岸的状态类似记作的状态类似记作.由题设由题设,状态状态(0,1,1,0),(0,0,1,1),(0,1,1,1)是不允许是不允许的的,从而对应状态从而对应状态(1,0,0,1),(1,1,0,0),(1,0,0,0)也是不允许的也是不允许的.以可以可允许的允许的10个个状态状态向量作为顶点向量作为顶点,将可能互相转移的将可能互相转移的状态用线段连接起
4、来构成一个图状态用线段连接起来构成一个图.根据此图便可找到根据此图便可找到渡河方法渡河方法.第5页,本讲稿共60页(1,1,1,1)(1,1,1,0)(1,1,0,1)(1,0,1,1)(1,0,1,0)(0,0,0,0)(0,0,0,1)(0,0,1,0)(0,1,0,0)(0,1,0,1)(0,1,0,1)(0,1,0,0)(0,0,1,0)(0,0,0,1)(0,0,0,0)(1,0,1,0)(1,0,1,1)(1,1,0,1)(1,1,1,0)(1,1,1,1)河西河西=(=(人人,狼狼,羊羊,菜菜)河东河东=(=(人人,狼狼,羊羊,菜菜)将将10个顶点分别记为个顶点分别记为A1,A2
5、,A10,则则渡河问题化为在该图中求渡河问题化为在该图中求一条从一条从A1到到A10的路的路.从图中易得到两条路:从图中易得到两条路:A1 A6 A3 A7 A2 A8 A5 A10;A1 A6 A3 A9 A4 A8 A5 A10.第6页,本讲稿共60页图的矩阵表示图的矩阵表示 第7页,本讲稿共60页邻接表邻接表12345623413513623634512456第8页,本讲稿共60页拓扑排序拓扑排序 按照有向图给出的次序关系,将图中顶点排成一个线按照有向图给出的次序关系,将图中顶点排成一个线性序列,对于有向图中没有限定次序关系的顶点,则可性序列,对于有向图中没有限定次序关系的顶点,则可以人
6、为加上任意的次序关系。由此所得顶点的线性序列以人为加上任意的次序关系。由此所得顶点的线性序列称之为拓扑有序序列称之为拓扑有序序列例如:对于有向图例如:对于有向图可求得拓扑有序序列可求得拓扑有序序列:A B C D 或或 A C B D第9页,本讲稿共60页问题:求网线线序问题:求网线线序网线从机房连接到办公室在机房,所有网线从左到右编号为1,2,3,N 给出每两条线是否交叉的信息,请计算办公室内从左到右各条线的编号 大数指向小数 由小到大做拓扑排序第10页,本讲稿共60页欧拉道路和回路经过每条边一次且仅一次经过每条边一次且仅一次先看回路先看回路必要条件:所有点度为偶数必要条件:所有点度为偶数充
7、分条件:还是充分条件:还是“所有点度为偶数所有点度为偶数”证明!证明!把欧拉回路构造出来把欧拉回路构造出来“圈套圈圈套圈”可能套不出来吗?想一想可能套不出来吗?想一想第11页,本讲稿共60页幼儿园的粉刷幼儿园里有很多房屋幼儿园里有很多房屋房屋与房屋之间连以走廊房屋与房屋之间连以走廊走廊与房屋之间有一扇门走廊与房屋之间有一扇门幼儿园长想把门漆成绿色或者黄色,使得幼儿园长想把门漆成绿色或者黄色,使得任意一条走廊两头门的颜色不同任意一条走廊两头门的颜色不同任意一间房屋上的门,绿色门的数量与黄色门的数量相差不超过任意一间房屋上的门,绿色门的数量与黄色门的数量相差不超过1。如何实现?如何实现?每个房屋的
8、门都是偶数个每个房屋的门都是偶数个把奇数改造成偶数!把奇数改造成偶数!第12页,本讲稿共60页最小生成树问题求一个连通子图,使得边权和最小求一个连通子图,使得边权和最小第13页,本讲稿共60页Prim算法任意时刻的中间结果都是一棵树任意时刻的中间结果都是一棵树从一个点开始从一个点开始每次都花最小的代价,用一条加进一个新点每次都花最小的代价,用一条加进一个新点问题:问题:这样做是对的吗?这样做是对的吗?如何快速找到这个如何快速找到这个“最小代价最小代价”?堆!堆!第14页,本讲稿共60页Prim算法框架初始化,树仅含一个任意一点v0把v0的邻边插入堆for i:=1 to n-1 dobegin
9、 从堆中取出最小值,设边为(u,v),v为新点 (u,v)加入生成树中 v和它所有不在树中的邻居组成的边插入堆end;每次取最小值为O(logm)总时间复杂度为O(nlogm)第15页,本讲稿共60页Kruskal算法任意时刻的中间结果是一个森林任意时刻的中间结果是一个森林从从n个点的集合开始个点的集合开始每次选不产生圈的前提下权最小的边加入每次选不产生圈的前提下权最小的边加入问题:问题:这样做是对的吗?这样做是对的吗?如何快速的判断是否产生圈如何快速的判断是否产生圈并查集并查集第16页,本讲稿共60页Kruskal算法框架把所有边按照权值从小到大排序为把所有边按照权值从小到大排序为e1,e2
10、,初始化初始化n个集合,个集合,Si=isize:=0;fori:=1tomdoifei的两个端点的两个端点u,v不在同一个集合不在同一个集合thenbegin合并合并Su和和Svinc(size);ifsize=n1thenbreak;end;最坏情况循环执行最坏情况循环执行m次,判断约次,判断约O(1)如果输入已经排序好,则总时间复杂度为如果输入已经排序好,则总时间复杂度为O(m),否则为,否则为O(mlogm)第17页,本讲稿共60页SSSP(Dijkstra算法)核心思想:按路径递增的次序产生最短路径的算法核心思想:按路径递增的次序产生最短路径的算法1)找到图中最短的路径,设为(找到图
11、中最短的路径,设为(v,vj),将将j设为已标号的点设为已标号的点2)找下一条次短的路径,假设终点为找下一条次短的路径,假设终点为k,将将k设为已标号的设为已标号的点点,那么要么是(那么要么是(v,vk)要么是()要么是(v,vj,vk),若经过若经过vj,将将j设设为已检查的点为已检查的点,放入集合放入集合.3)以次短路径出发找第三短的路径以次短路径出发找第三短的路径,类似第二步的方法类似第二步的方法.4)按上述方法一直到所有的顶点被检查过按上述方法一直到所有的顶点被检查过,则从则从v到其他顶到其他顶点的最短路径求出点的最短路径求出.第18页,本讲稿共60页Dijkstra算法算法令d(u)
12、=mindv+w(v,u)|v存在,设 中最小的元素为i,则令(即求出了i的最短路长度),并根据di来对 进行更新。每次求出一个d值,重复n次就可以得到所有点的最短路径长度。下面是Dijkstra算法的伪代码:Proc SSSP_Dijkstra(start:integer);For i:=1 to n do d(i):=;d(start):=0;For k:=1 To n Do【i:=GetMin(ProcSSSP_Dijkstra(start:integer);Fori:=1tondod(i):=;d(start):=0;Fork:=1TonDo【i:=GetMin();取出d中值最小的结
13、点idi:=d(i);Delete(i,d);令di等于d(i),并将i从d中删除Foreachnodeuexistedge(i,u)【对每条从i连出的边进行检查Ifd(u)du+w(u,v)then/松弛判断dv=du+w(u,v)/松弛操作2阶段结束foreachedge(u,v)E(G)doIfdvdu+w(u,v)thenExitfalseExittrue第21页,本讲稿共60页SPFA(Shortest Path Faster Algorithm)SPFA对对Bellman-Ford算法优化的关键之处在于意识到:只有那算法优化的关键之处在于意识到:只有那些在前一遍松弛中改变了距离估计
14、值的点,才可能引起他们些在前一遍松弛中改变了距离估计值的点,才可能引起他们的邻接点的距离估计值的改变。因此,用一个先进先出的队的邻接点的距离估计值的改变。因此,用一个先进先出的队列来存放被成功松弛的顶点。初始时,源点列来存放被成功松弛的顶点。初始时,源点s入队。当队列不入队。当队列不为空时,取出对首顶点,对它的邻接点进行松弛。如果某个为空时,取出对首顶点,对它的邻接点进行松弛。如果某个邻接点松弛成功,且该邻接点不在队列中,则将其入队。经邻接点松弛成功,且该邻接点不在队列中,则将其入队。经过有限次的松弛操作后,队列将为空,算法结束。过有限次的松弛操作后,队列将为空,算法结束。SPFA算法算法的实
15、现,需要用到一个先进先出的队列的实现,需要用到一个先进先出的队列queue和一个指示顶点是和一个指示顶点是否在队列中的否在队列中的标记数组标记数组mark。第22页,本讲稿共60页SPFA算法 设立一个先进先出的队列用来保存待优化的结点,优化时每次取出队首结点设立一个先进先出的队列用来保存待优化的结点,优化时每次取出队首结点u,并且用,并且用u点当前的最短路径估计值对离开点当前的最短路径估计值对离开u点所指向的结点点所指向的结点v进行松弛操作,如果进行松弛操作,如果v点点的最短路径估计值有所调整,且的最短路径估计值有所调整,且v点不在当前的队列中,就将点不在当前的队列中,就将v点放入队尾。这样
16、不点放入队尾。这样不断从队列中取出结点来进行松弛操作,直至队列空为止。断从队列中取出结点来进行松弛操作,直至队列空为止。SPFA(G,w,s)1.INITIALIZE-SINGLE-SOURCE(G,s)2.INITIALIZE-QUEUE(Q)3.ENQUEUE(Q,s)4.While Not EMPTY(Q)5.Do u DLQUEUE(Q)6.For 每条边每条边(u,v)EG7.Do tmp dv8.Relax(u,v,w)9.If(dv tmp)and(v不在不在Q中中)10.ENQUEUE(Q,v)我们用数组我们用数组d记录每个结点的最短路径估计值,而且用邻接表来存储图记录每个结点
17、的最短路径估计值,而且用邻接表来存储图G。我。我们采取的方法是动态逼近法:们采取的方法是动态逼近法:第23页,本讲稿共60页floyd-warshall算法算法设设di,j,k是是在只允许经过结点在只允许经过结点1k的情况下的情况下i到到j的最短路长度的最短路长度则它有两种情况(想一想,为什么):则它有两种情况(想一想,为什么):如果最短路经过点如果最短路经过点k,那么,那么di,j,k应该等于应该等于di,k,k-1+dk,j,k-1;如果最短路不经过点如果最短路不经过点k,那么,那么di,j,k应该等于应该等于di,j,k-1。综合起来综合起来di,j,k=mindi,k,k-1+dk,j
18、,k-1,di,j,k-1边界条件是边界条件是di,j,0=w(i,j)(不存在的边权为(不存在的边权为)第24页,本讲稿共60页floyd-warshall算法基本的动态规划把k放外层循环,可以节省内存对于每个k,计算每两点的目前最短路for k:=1 to n dofor i:=1 to n do for j:=1 to n do if(di,k)and(dk,j)and(di,k+dk,jdi,j)then di,j:=di,k+dk,j一定要背下来!时间复杂度:O(n3)用途:预处理!第25页,本讲稿共60页第26页,本讲稿共60页选址问题选址问题现准备现准备在在n 个个居民点居民点v
19、1,v2,vn中设置一银中设置一银行行.问设在哪个点问设在哪个点,可使最大服务距离最小可使最大服务距离最小?若设置两个银行若设置两个银行,问设在哪两个点问设在哪两个点?模型假设模型假设 假设各假设各个个居民点都有条件设置居民点都有条件设置银行银行,并有路相连并有路相连,且路长已知且路长已知.第27页,本讲稿共60页模型建立与求解模型建立与求解用用Floyd算法求出任意两算法求出任意两个个居民点居民点vi,vj 之间的最短距离之间的最短距离,并用并用dij 表表示示.设置一个银行设置一个银行,银行设银行设在在vi 点点的最大服务距离为的最大服务距离为求求k,使使 即若设置一个银行即若设置一个银行
20、,则银行设在则银行设在vk 点点,可使最大服务距离最小可使最大服务距离最小.设置两个银行设置两个银行,假设银行设假设银行设在在vs,vt 点点使最大服务距离最小使最大服务距离最小.记记则则s,t 满足:满足:进一步进一步,若设置多个银行呢?若设置多个银行呢?第28页,本讲稿共60页求求k,使使 即若设置一个银行即若设置一个银行,则银行设在则银行设在vk 点点,可使最可使最大服务距离最小大服务距离最小.设置两个银行设置两个银行,假设银行设假设银行设在在vs,vt 点点使最使最大服务距离最小大服务距离最小.记记则则s,t 满足:满足:进一步进一步,若设置多个银行呢?若设置多个银行呢?第29页,本讲
21、稿共60页最优贸易最优贸易某国有某国有M个城市个城市N条道路,任意两个城市有道路,有一部分道路为单条道路,任意两个城市有道路,有一部分道路为单行线,一部分为双向道路。行线,一部分为双向道路。某人去该国旅游,从城市某人去该国旅游,从城市1出发到城市出发到城市n结束,他想做水晶球的生结束,他想做水晶球的生意一次挣点旅行费用,每个城市有一个水晶球的价格(买入卖出意一次挣点旅行费用,每个城市有一个水晶球的价格(买入卖出都一样),他可以经过每个城市多次。都一样),他可以经过每个城市多次。问他能挣最多的费用为多少?问他能挣最多的费用为多少?如下图,假设城市如下图,假设城市15的价格为的价格为4,3,5,6
22、,1则选择则选择1-4-5-4-5路线,路线,挣得挣得5第30页,本讲稿共60页分析这是一道非常典型的图论题这是一道非常典型的图论题,如果有扎实的图论基础解决起来并如果有扎实的图论基础解决起来并不困难不困难.解决这道题的关键是发现解决这道题的关键是发现,我们可以将原图中的任意一个强连通我们可以将原图中的任意一个强连通分量收缩为一个点分量收缩为一个点,这个新点的买入价格等于该强连通分量中这个新点的买入价格等于该强连通分量中最小的买入价格最小的买入价格,这个新点的卖出价格等于该强连通分量中最这个新点的卖出价格等于该强连通分量中最大的卖出价格大的卖出价格.这是因为这是因为,这个新点的性质和一个强连通
23、分量是这个新点的性质和一个强连通分量是一样的一样的,如果我们要在一个强连通分量中进行购买操作如果我们要在一个强连通分量中进行购买操作,一定会选择一定会选择买入价格最小的那个点买入价格最小的那个点,如果我们要在一个强连通分量中进行卖出如果我们要在一个强连通分量中进行卖出操作操作,也一定会选择卖出价格最大的那个点也一定会选择卖出价格最大的那个点.第31页,本讲稿共60页分析所以算法就非常清晰了所以算法就非常清晰了.首先利用首先利用DFS将所有的强连通分量收缩将所有的强连通分量收缩,这这样我们就可以得到一个有向无环图样我们就可以得到一个有向无环图G.由于由于G中没有环中没有环,我们可我们可以对以对G
24、进行拓扑排序进行拓扑排序,然后利用递推求得到达某个点然后利用递推求得到达某个点i时时,可能的最低可能的最低买入价格买入价格best(i)是多少是多少,以及该点最终能否到达终点以及该点最终能否到达终点.最后对于所有最后对于所有能够到达终点的点能够到达终点的点p,设其卖出价格为设其卖出价格为sell(p),在在sell(p)-best(p)中取中取最大值即得到答案最大值即得到答案.时间复杂度仅为时间复杂度仅为O(V+E).在实现的时候最好使用栈消除在实现的时候最好使用栈消除DFS中的递归调用中的递归调用,因为图中的点可因为图中的点可以达到以达到100000,当递归深度达到这么大的时候有相当大的几率
25、当递归深度达到这么大的时候有相当大的几率发生栈溢出发生栈溢出.参考实现中采用了非递归实现参考实现中采用了非递归实现DFS.第32页,本讲稿共60页奇怪的电梯奇怪的电梯大楼的每一层楼都可以停电梯,而且第大楼的每一层楼都可以停电梯,而且第i层楼层楼(1=i=N)上有一个数上有一个数字字Ki(0=Ki=N)。电梯只有四个按钮:开,关,上,下。上下的层。电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如:钮就会失灵。例如:33125代表了代表了Ki(K1=3,K2=3,),从
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基本 算法 应用 精品 文稿
限制150内