




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
图的基本算法第一页,共五十七页,编辑于2023年,星期二CompanyLogo
图的一些基本概念及其表示Contents拓扑排序和欧拉回路问题最小生成树和单源最短路问题二分图匹配1234第二页,共五十七页,编辑于2023年,星期二CompanyLogo定义与术语图:二元组<V,E>称为图(graph)。V为结点(node)点(vertex)集。
E为中结点之间的边的集合。子图:什么是子图如果有两个图G和G’,G’的顶点集是G的顶点集的子集,且G’的边集点对(u,v)称为边(edge)或称弧(arc),其中u,v属于V,称u,v是相邻的(adjacent),称u,v与边相关联(incident)。连通图:如果图中任意一对顶点都有路径存在,则称该图为连通的第三页,共五十七页,编辑于2023年,星期二CompanyLogo定义与术语若边的点对(u,v)有序则称为有向(directed)边,其中u称为头(head),v称为尾(tail)。所形成的图称有向图(directedgraph)。为对于u来说是出边(outgoingarc);对于v来说是入边(incomingarc)。反之,若边的点对无序则称为无向(undirected)边,所形成的图称无向图(undirectedgraph)。第四页,共五十七页,编辑于2023年,星期二CompanyLogo定义与术语度(degree):一个顶点的度是指与该边相关联的边的条数,顶点v的度记作deg(v)。无向图:
有向图:入度(indegree):在有向图中,一个顶点v的入度是指与该边相关联的入边(即边的尾是v)的条数。出度(outdegree):在有向图中,一个顶点的出度是指与该边相关联的出边(即边的头是v)的条数。路径:如果从一个顶点v1出发,沿着一些边依次经过一些定点v2,v3……,vn,则称顶点序列(v1,v2,…..,vn)为从顶点v1到vn的路径。回路:如果一条路径上第一个顶点和最后一个顶点是相同的,则称这样的路径为回路或环。第五页,共五十七页,编辑于2023年,星期二CompanyLogo图的表示要表示一个图G=(V,E),有两种标准的方法,即邻接表和邻接矩阵。这两种方法即可以用于有向图,也可以用于无向图。第六页,共五十七页,编辑于2023年,星期二用邻接表记录图
StructEdge { intdest;//记录目的地 intvalue;//边的权值 Edge*link;//记录链表的下一个元素 }; Edge*edge=newEdge[n];//申请空间 for(inti=0;i<n;i++) edge[i]=NULL;Edge*L;While(cin>>u>>v)//(u,v)表示一条边{ L=newEdge; L->dest=v;//填写目的地 L->link=edge[u];//用新建的这条边指向顶点u指向的链表 edge[u]=L;//再把L赋给edge[u]}CompanyLogo第七页,共五十七页,编辑于2023年,星期二遍历邻接表 for(inti=0;i<n;i++) { L=edge[i];//取得邻接表的链表入口 while(L!=NULL)//输出从顶点i出发可以到达的边 { cout<<i<<“”<<L->dest<<endl; L=L->link;//取链表的下一个元素 } }CompanyLogo第八页,共五十七页,编辑于2023年,星期二CompanyLogoDFS,BFS拓扑排序强连通分支欧拉路径和回路最小生成树最短路径哈密顿回路(NP)差分约束系统网络流二分图匹配图论涉及到的问题和算法第九页,共五十七页,编辑于2023年,星期二CompanyLogo今天要讲的问题最小生成树最短路算法拓扑排序欧拉回路二分图的匹配第十页,共五十七页,编辑于2023年,星期二拓扑排序拓扑排序是对有向无回路图(DAG)顶点的一种排序,它使得如果存在u,v的有向路径,那么满足序中u在v前。拓扑排序就是由一种偏序(particalorder)得到一个全序(称为拓扑有序(topologicalorder))。偏序是满足自反性,反对称性,传递性的序。一个图的拓扑排序得到的结果可以看成是图中所有顶点沿水平线排列而成的序列,而且所有的有向边均是从左指向右在有向无回路图用于说明事件发生的先后顺序拓扑排序可以给出一个满足时间先后的顺序CompanyLogo第十一页,共五十七页,编辑于2023年,星期二陈熙大牛穿衣服的例子CompanyLogo第十二页,共五十七页,编辑于2023年,星期二拓扑排序算法描述拓扑排序的思路很简单,就是每次任意找一个入度为0的点输出,并把这个点以及与这个点相关的边删除。实际算法中,用一个队列实现。算法: 1.把所有入度=0的点入队Q。 2.若队Q非空,则点u出队,输出u;否则转4。 3.把所有与点u相关的边(u,v)删除,若此过程中有点v的入度变为0,则把v入队Q,转2。 4.若出队点数<N,则说明有圈。
时间复杂度O(V+E)CompanyLogo第十三页,共五十七页,编辑于2023年,星期二欧拉回路欧拉回路,又称“一笔画”,是图论中可行遍性问题的一种欧拉回路问题是图论中最古老的问题之一。它诞生于十八世纪的欧洲古城哥尼斯堡。普瑞格尔河流经这座城市,人们在两岸以及河中间的两个小岛之间建了七座桥。市民们喜欢在这里散步,于是产生了这样一个问题:是否可以找到一种方案,使得人们从自己家里出发,不重复地走遍每一座桥,然后回到家中?这个问题如果用数学语言来描述,就是在右图中找出一条回路,使得它不重复地经过每一条边。这便是著名的“哥尼斯堡七桥问题”。CompanyLogo第十四页,共五十七页,编辑于2023年,星期二一些概念及定理欧拉回路:图G中经过每条边一次并且仅一次的回路称作欧拉回路。欧拉路径:图G中经过每条边一次并且仅一次的路径称作欧拉路径。欧拉图:存在欧拉回路的图称为欧拉图。半欧拉图存在欧拉路径但不存在欧拉回路的图称为半欧拉图。我们经常需要判定一个图是否为欧拉图(或半欧拉图),并且找出一条欧拉回路(或欧拉路径)。对于无向图有如下结论:定理1无向图G为欧拉图,当且仅当G为连通图且所有顶点的度为偶数。CompanyLogo第十五页,共五十七页,编辑于2023年,星期二一些概念及定理推论1无向图为半欧拉图,当且仅当G为连通图且除了两个顶点的度为奇数之外,其它所有顶点的度为偶数。定理2有向图为欧拉图,当且仅当G的基图连通,且所有顶点的入度等于出度。推论2有向图为半欧拉图,当且仅当G的基图连通,且存在顶点的入度比出度大1、的入度比出度小1,其它所有顶点的入度等于出度。
基图:忽略有向图所有边的方向,得到的无向图称为该有向图的基图。CompanyLogo第十六页,共五十七页,编辑于2023年,星期二欧拉回路算法描述由此可以得到以下求欧拉图的欧拉回路的算法:在图G中任意找一个回路;将图G中属于回路的边删除;在残留图的各极大连通子图中分别寻找欧拉回路;将各极大连通子图的欧拉回路合并到中得到图的欧拉回路。CompanyLogo第十七页,共五十七页,编辑于2023年,星期二算法描述ProcedureEuler-circuit();BeginFor顶点start的每个邻接点vDoIf边(start,v)未被标记ThenBegin
将边(start,v)作上标记;
将边(v,start)作上标记;Euler-circuit(v);
将边(start,v)加入栈;End;End;最后依次取出栈S每一条边而得到图G的欧拉回路。由于该算法执行过程中每条边最多访问两次,因此该算法的时间复杂度为O(E)。CompanyLogo第十八页,共五十七页,编辑于2023年,星期二例题例题一单词游戏题目描述有N个盘子,每个盘子上写着一个仅由小写字母组成的英文单词。你需要给这些盘子安排一个合适的顺序,使得相邻两个盘子中,前一个盘子上面单词的末字母等于后一个盘子上面单词的首字母。请你编写一个程序,判断是否能达到这一要求。如果能,请给出一个合适的顺序。数据规模
N<=100000分析通过对题目条件的一些初步分析,我们很容易得到下面的模型。CompanyLogo第十九页,共五十七页,编辑于2023年,星期二分析模型1:以N个盘子作为顶点;如果盘子A的末字母等于盘子B的首字母,那么从A向B连一条有向边。对于样例我们可以按下图所示的方式构图。这样,问题转化为在图中寻找一条不重复地经过每一个顶点的路径,即哈密尔顿路。然而,求哈密尔顿路是一个十分困难的问题,这样的模型没有给我们的解题带来任何便利。因此,我们必须另辟蹊径。CompanyLogo第二十页,共五十七页,编辑于2023年,星期二分析模型2:经过分析,我们发现模型1的失败之处在于,图中需要遍历的信息——也就是每一个盘子——表示在顶点上,而顶点的遍历问题不易解决。能否将遍历信息表示在边上呢?考虑如下的构图方法:以26个字母作为顶点;对于每一个盘子,如果它的首字母为c1,末字母为c2,那么从c1向c2连一条有向边。对于样例我们可以按下图所示的方式构图这样,问题转化为在图中寻找一条不重复地经过每一条边的路径,即欧拉路径。这个问题能够在O(E)时间内解决。CompanyLogo第二十一页,共五十七页,编辑于2023年,星期二最小生成树在电路设计中,常常需要把一些电子元件的插脚用电线连接起来。如果每根电线连接两个插脚,把所有n个插脚连接起来,只要用n-1根电线就可以了。在所有的连接方案中,我们通常对电线总长度最小的连接方案感兴趣。把问题转化为图论模型就是:一个无向连通图G=(V,E),V是插脚的集合,E是插脚两两之间所有可能的连接的集合。给每条边(u,v)一个权值w(u,v),表示连接它们所需的电线长度。我们的目标就是找到一个无环的边集T,连接其中所有的点且使总权值最小。既然T是连接所有点的无环边集,它一定是一棵树。因为这棵树是从图G中生成出来的,我们把它叫做生成树。如果一棵生成树在所有生成树中总权值最小,我们就把它称作最小生成树。CompanyLogo第二十二页,共五十七页,编辑于2023年,星期二KruskalMST-KRUSKAL(G,w)1.A←Ф2.for每个结点v∈V[G]3.doMAKE-SET(v)4.根据权w的非递减顺序对E的边进行排序5.for每条边(u,v)∈E,按权的非递减次序6.doifFIND-SET(u)≠FIND-SET(v)7.thenA←A∪{(u,v)}8.UNION(u,v)9.returnA复杂度E*lgECompanyLogo第二十三页,共五十七页,编辑于2023年,星期二步骤CompanyLogo第二十四页,共五十七页,编辑于2023年,星期二步骤CompanyLogo第二十五页,共五十七页,编辑于2023年,星期二步骤CompanyLogo第二十六页,共五十七页,编辑于2023年,星期二步骤CompanyLogo第二十七页,共五十七页,编辑于2023年,星期二Prim算法Kruskal找出连接任意两棵树的所有边中,具有最小权值的边(u,v),把它添加到正在生长的森林中。Prim的特点它一直维持生成单棵树,而Kruskal生成时可以存在多个树。Prim每次选一个点加入到集合中,直到把所有点都加入到集合中CompanyLogo第二十八页,共五十七页,编辑于2023年,星期二算法描述MST-PRIM(G,w,r)1.Q←V[G]2.for每个u∈Q3.dokey[u]←∞4.key[r]←05.π[r]←NIL6.whileQ<>Ф7.dou←EXTRACT-MIN(Q){返回队列Q中最小的元素}8.for每个v∈Adj[u]9.doifv∈Qandw(u,v)<key[v]10.thenπ[v]←u11.key[v]←w(u,v)CompanyLogo第二十九页,共五十七页,编辑于2023年,星期二执行过程CompanyLogo第三十页,共五十七页,编辑于2023年,星期二执行过程CompanyLogo第三十一页,共五十七页,编辑于2023年,星期二执行过程CompanyLogo第三十二页,共五十七页,编辑于2023年,星期二最短路概述最短路问题是图论中的核心问题之一,它是许多更深层算法的基础。同时,该问题有着大量的生产实际的背景。不少问题从表面上看与最短路问题没有什么关系,却也可以归结为最短路问题乘汽车旅行的人总希望找出到目的地尽可能短的行程。如果有一张地图并在地图上标出了每对十字路口之间的距离,如何找出这一最短行程?在乘车旅行的例子中,我们可以把公路地图模型化为一个图:结点表示路口,边表示连接两个路口的公路,边权表示公路的长度。我们的目标是从起点出发找一条到达目的地的最短路径。CompanyLogo第三十三页,共五十七页,编辑于2023年,星期二最短路概述我们一般所将的都是单源最短路径问题,即我们希望找出从某给定点s到每个顶点的最短路径。不过有许多其他的问题也可以用最短路算法解决单目标最短路径问题:找出从每一结点v到某指定结点u的一条最短路径。把图中的每条边反向,我们就可以把这一问题转化为单源最短路径问题。单对结点间的最短路径问题:对于某给定结点u和v,找出从u到v的一条最短路径。如果我们解决了源结点为u的单源问题,则这一问题也就获得了解决每对结点间的最短路径问题:对于每对结点u和v,找出从u到v的最短路径。我们可以用单源算法对每个结点作为源点运行一次就可以解决问题。CompanyLogo第三十四页,共五十七页,编辑于2023年,星期二最短路涉及到的问题负权边值:在某些最短路的实例中,可能存在权值为负的边。如果存在一条从s可达的负权回路,那么最短路的权的定义就不能存在了。因为只要穿越负权回路任意次我们就可以发现从s到e可以无限变小。CompanyLogo第三十五页,共五十七页,编辑于2023年,星期二最短路涉及到的问题回路:一条最短路径能包含回路吗?它不能包含负权回路。它也不会包含正权回路,因为从路径上移去回路后回路后可以产生一个具有相同源点和终点,权值更小的路径。CompanyLogo第三十六页,共五十七页,编辑于2023年,星期二松弛技术对于每个顶点v,都设置了一个属性d[v],用来描述从源点s到v的最短路的上界,称为最短路径估计。init(){ for(inti=0;i<n;i++) d[i]=∞; d[s]=0}Relax(u,v,w){ If(d[v]>d[u]+w) d[v]=d[u]+w; pre[v]=u;}三角不等式:对于任意边(u,v),有δ(s,v)≤δ(s,u)+w(u,v).CompanyLogo第三十七页,共五十七页,编辑于2023年,星期二CompanyLogo最短路算法DijkstraSPFABellmanFord最短路算法第三十八页,共五十七页,编辑于2023年,星期二最短路算法我们着重讨论两种常用算法:Dijkstra算法和Bellman-Ford算法。虽然它们都是建立在松弛技术基础上的算法,但是在实现上有着各自的特点,适用的范围也有所不同。另外,我们还将介绍一种期望复杂度与边数同阶的高效算法——SPFA算法,并对其复杂度作出简要的分析。CompanyLogo第三十九页,共五十七页,编辑于2023年,星期二DijkstraDijkstra算法解决了有向加权图的最短路径问题,该算法的条件是该图所有边的权值非负,因此在本小节我们约定:对于每条边(u,v)E,w(u,v)>=0。Dijkstra算法中设置了一结点集合S,从源结点s到集合S中结点的最终最短路径的权均已确定,即对所有结点v属于S,有d[v]已经为最小。算法反复挑选出其最短路径估计为最小的结点u属于V-S,把u插入集合S中,并对离开u的所有边进行松弛CompanyLogo第四十页,共五十七页,编辑于2023年,星期二Dijkstra算法描述Dijkstra(G,w,s)INIT(G,S)S=NULLQ=V[G]WhileQDou=EXTRACT-MIN(Q)S=SU{u}For每个顶点vAdj[u]DoRELAX(u,v,w)CompanyLogo第四十一页,共五十七页,编辑于2023年,星期二算法执行过程CompanyLogo第四十二页,共五十七页,编辑于2023年,星期二Bellman-Ford
Bellman-Ford算法Bellman-Ford算法能在更一般的情况下解决单源点最短路径问题,在该算法下边的权可以为负。正如Dijkstra算法一样,Bellman-Ford算法运用了松弛技术,对每一结点v,逐步减小从源s到v的最短路径的估计值d[v]直至其达到实际最短路径的权
(s,v),如果图中存在负权回路,算法将会报告最短路不存在。Bellman-Ford算法可以用于解决差分约束系统CompanyLogo第四十三页,共五十七页,编辑于2023年,星期二算法描述Bellman-Ford(G,w,s)init(G,s)Fori1to|V[G]|-1DoFor每条边(u,v)E[G]DoRELAX(u,v,w)For每条边(u,v)E[G]DoIfd[v]>d[u]+w(u,v)ThenReturnFALSEReturnTRUE时间复杂度为O(V*E);CompanyLogo第四十四页,共五十七页,编辑于2023年,星期二执行过程CompanyLogo第四十五页,共五十七页,编辑于2023年,星期二Bellman-Ford思想Bellman-Ford算法的思想基于以下事实:“两点间如果有最短路,那么每个结点最多经过一次。也就是说,这条路不超过n-1条边。”(如果一个结点经过了两次,那么我们走了一个圈。如果这个圈的权为正,显然不划算;如果是负圈,那么最短路不存在;如果是零圈,去掉不影响最优值)根据最短路的最优子结构,路径边数上限为k时的最短路可以由边数上限为k-1时的最短路“加一条边”来求,而根据刚才的结论,最多只需要迭代n-1次就可以求出最短路。CompanyLogo第四十六页,共五十七页,编辑于2023年,星期二SPFAShortest
path
faster
algorithmSPFA其实就是Bellman-Ford的一种队列实现,减少了冗余,即松驰的边至少不会以一个d为∞的点为起点。算法:1.队列Q={s},,2.取出队头u,枚举所有的u的临边.若d(v)>d(u)+w(u,v)则改进,pre(v)=u,由于d(v)减少了,v可能在以后改进其他的点,所以若v不在Q中,则将v入队。3.一直迭代2,直到队列Q为空(正常结束),或有的点的入队次数>=n(含有负圈)。CompanyLogo第四十七页,共五十七页,编辑于2023年,星期二SPFA算法分析一般用于找负圈(效率高于Bellman-Ford),稀疏图的最短路由于点可能多次入队,但队列中同时不会超过n个点。所以用一个长度为n的循环队列来实现这个队。SPFA在形式上和宽度优先搜索非常类似,不同的是宽度优先搜索中一个点出了队列就不可能重新进入队列,但是SPFA中一个点可能在出队列之后再次被放入队列,也就是一个点改进过其它的点之后,过了一段时间可能本身被改进,于是再次用来改进其它的点,这样反复迭代下去。设一个点用来作为迭代点对其它点进行改进的平均次数为k,有办法证明对于通常的(不含负圈,较稀疏)情况,k在2左右。算法复杂度理论上同Bellman-Ford,O(nm),但实际上却是O(km)。
CompanyLogo第四十八页,共五十七页,编辑于2023年,星期二例题例题1——货币兑换(pku1860|zju1544)若干个货币兑换点在我们的城市中工作着。每个兑换点只能进行两种指定货币的兑换。不同兑换点兑换的货币有可能相同。每个兑换点有它自己的兑换汇率,货币A到货币B的汇率表示要多少单位的货币B才能兑换到一个单位的货币A。当然货币兑换要支付一定量的中转费。例如,如果你想将100美元兑换成俄元,汇率是29.75,中转费为0.39,那么你会兑换到(100-0.39)×29.75=2963.3975俄元。CompanyLogo第四十九页,共五十七页,编辑于2023年,星期二例题城市中流通着N(N<=100)类货币,用数字1至N标号表示。每个货币兑换点用6个数字来描述:整数A和B是兑换货币的编号,实数RAB,CAB,RBA,CBA分别是A兑换成B和B兑换成A的汇率和中转费用。Nick有一些第S类货币,他想在若干次交换后增加他的资金,当然这些资金最终仍是第S类货币。请你告诉他该想法能否实现SampleInput
32120.0//货币数量,兑换点数量,初始货币编号资金
121.001.001.001.00//A,B,Rab,Rba,Cab,Cba 231.101.001.101.00SampleOutput YESCompanyLogo第五十页,共五十七页,编辑于2023年,星期二分析如果我们可以求出,通过一系列的兑换
每种货币可以得到的最大值,那么问题便迎刃而解了。因为要是可以得到的第S类货币最大值都不比初值大,资金肯定无法增加;否则,得到最大值的过程就是一种解法。到了这里,我们发现求最大值和我们学过的求最短路很类似,构图用最短路算法做也显得水到渠成了。具体做法是:将N种货币看成N个结点,将每个兑换点转化为两条有向边。根据兑换公式,目前从A货币兑换到B货币的汇率和中转费用为RAB,CAB,那么由对应的A结点向B结点连一条有向边,从A点得到的B的可能最大值为:(A目前的最大值-CAB)×RAB。CompanyLogo第五十一页,共五十七页,编辑于2023年,星期二分析注意,这里所求的是最大值,为了转化为最短路,我们可以在数字前面加上一个负号。更简洁的方法是利用求最短路
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 流媒体服务质量评价方法-全面剖析
- 立式加工中心精度控制-全面剖析
- 智能营销内容审核机制-全面剖析
- 林地流转市场分析-全面剖析
- 关节扭伤治疗药物研究-全面剖析
- 音响行业数字化转型趋势-全面剖析
- 2024年中国电气装备平高集团平高电气招聘考试真题
- 职业素养培养体系构建-全面剖析
- 深井开采安全防控技术-全面剖析
- 微处理器架构创新-全面剖析
- 提高学生英语听力能力-英语教师的演讲
- 2025年湖北省八市高三(3月)联考英语试题(含答案和音频)
- 县域产业布局与升级-深度研究
- 第十六周《“粽”享多彩端午深耕文化传承》主题班会
- 日间患者流程护理质量改善项目汇报
- 创意美术网络安全课件
- 上海电信2025年度智慧城市合作协议2篇
- 2024燃煤发电企业安全生产标准化达标评级标准
- 产前检查妇产科教学课件
- 气球婚礼派对合同范例
- 2024无人机测评规范
评论
0/150
提交评论