图论与特殊图概述

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 问题描述 • 给出一些字符串,让你首尾串起来串成一串,并且输出一个字典序最小的方案。 如果不能,输出“***”。否则输出字典序最小的回路。 • 输入 • 2 • 6 • aloha • arachnid • dog • gopher • rat • tiger • 3 • oak • maple • elm • 输出 • aloha.arachnid.dog.gopher.rat.tiger • ***
哈密顿圈(环球旅行游戏)
问题3(四色问题): 对任何一张地图进行着色,两个共同边界的 国家染不同的颜色,则只需要四种颜色就够了.
问题4(关键路径问题): 一项工程任务,大到建造一座大坝,一座体育 中心,小至组装一台机床,一架电视机, 都要包括 许多工序.这些工序相互约束,只有在某些工序完 成之后, 一个工序才能开始. 即它们之间存在完 成的先后次序关系,一般认为这些关系是预知的, 而且也能够预计完成每个工序所需要的时间. 这时工程领导人员迫切希望了解最少需要多 少时间才能够完成整个工程项目, 影响工程进度 的要害工序是哪几个?
图论的基本概念
图论中的“图”并不是通常意义下的几何图 形或物体的形状图, 而是以一种抽象的形式来表 达一些确定的事物之间的联系的一个数学系统. 定义1 一个有序二元组(V, E ) 称为一个图, 记为G = (V, E ), 其中 ① V称为G的顶点集, V≠, 其元素称为顶 点或结点, 简称点; ② E称为G的边集, 其元素称为边, 它联结V 中的两个点, 如果这两个点是无序的, 则称该边 为无向边, 否则, 称为有向边. 如果V = {v1, v2, … , vn}是有限非空点 集, 则称G为有限图或n阶图.
欧拉算法描述
• if(k==0) //如果k=0,说明与当前顶点关联的边已穷尽 • { • Pop(S); • GetTop(S,m); • G[x][m]=1;G[m][x]=1;//恢复在上一层中被删除的边 • a=x+1;//如果可能的话,从当前节点的下一条关联边开始搜寻 • if(StackLength(S)!=e)//继续搜寻,边还没有全部遍历完 • { • Pop(S); //还原到上一步去 • DFS(G,S,m,a);// • }//if • else //搜寻完毕,将最后节点也入栈 • Push(S,x); • }//if • }//DFS
欧拉图
欧拉回路
• 首先介绍相关概念和定理。设是 G (V , E ) 一个图。 • 欧拉通路(回路):通过图G(无向图或有向图)中所有边一次且仅一 次行遍图中所有顶点的通路(回路)称为欧拉通路(回路)。 • 欧拉图与半欧拉图:具有欧拉回路的图称为欧拉图,具有欧拉通路而 无欧拉回路的图称为半欧拉图。 • 桥:设无向图G=<V,E>,若存在边集E的一个非空子集E1,使得 p(G-E1)>p(G),而对于E1的任意真子集E2,均有p(G-E2)=p(G) ,则称E1是G的边割集,或简称割集;若E1是单元集,即E1={e}, 则称e为割边或桥。[p(G)表示图G的连通分支数.]
图 2
称点vi , vj为边vivj的端点. 在有向图中, 称点vi , vj分别为边vivj的始点和终点.
对于一个图G = (V, E ), 人们常用图形来 表示它, 称其为图解. 凡是有向边, 在图解上都 用箭头标明其方向. 例如, 设V = {v1 , v2 , v3 , v4}, E = { v1v2 , v1v3 , v1v4 , v2v3 , v2v4 , v3v4}, 则G = (V, E ) 是一个有4个顶点和6条边的图, G的图解如下图所示.
• 构建欧拉回路的Fleury算法可以实用DFS来实现。
算法的图示动态过程:
欧拉算法描述
• void DFS(Graph &G,SqStack &S,int x,int t) • { • k=0;//一个标志,来标记当前访问的节点是否还有邻接边可供访问 • Push(S,x); //将本次遍历边所经由的点入栈 • for(i=t;i<v;i++) //v是顶点数,e是边数 • if(G[i][x]>0) • { • k=1; • G[i][x]=0; G[x][i]=0; //此边已访问,删除此边 • DFS(G,S,i,0);//寻找下一条关联的边,本次找到的是与x关联的i,在 • //下一层中将寻找与i关联的边 • break; • }//if,for
图1
图2
欧拉图
欧拉回路
• 无数热衷于此的人试图解决这个问题,但均以失败 告终。问题传到了欧拉(Leonhard Euler, 1707-1783)那里,立即引起了这位大数学家的 重视。经过悉心研究,欧拉终于在1736年发表了 论文《哥尼斯堡的七座桥》,不但成功地证明了“ 七桥问题”无解,而且找到了对于一般图是否存在 这类回路的充要条件。后人为了纪念欧拉这位伟大 的数学家,便将这类回路称为欧拉回路。
欧拉图
欧拉回路
• 欧拉回路问题是图论中最古老的问题 之一。它诞生于十八世纪的欧洲古城 哥尼斯堡。普瑞格尔河流经这座城市 ,人们在两岸以及河中间的两个小岛 之间建了七座桥(如图1)。 • 于是产生了这样一个问题:是否可以 找到一种方案,使得人们从自己家里 出发,不重复地走遍每一座桥,然后 回到家中?这个问题如果用数学语言 来描述,就是在图2中找出一条回路 ,使得它不重复地经过每一条边。这 便是著名的“哥尼斯堡七桥问题”。
欧拉算法描述
• void Euler(Graph &G,int x) • { • //G是存储图的邻接矩阵,都处理成无向图形式,值为1代表有边,0代表 无边,不包括自回路,x是出发点 • InitStack(S);//用来存放遍历边时依次走过的顶点 • DFS(G,S,x,0);//深度优先遍历查找,0是指查询的起点 • //输出 • while(!StackEmpty(S)) • { • GetTop(S,m); • printf("->v%d",m); • Pop(S); • }//while • }//Euler
例2、一笔画问题
无向欧拉图的判定
• 无向图存在欧拉回路的充要条件: 连通且没有奇点。 • 无向图存在欧拉路径的充要条件: 连通且奇点个数为2。
(1)既无欧拉回路,也无欧拉通路. (2)中存在欧拉通路,但无欧拉回路. (3)中存在欧拉回路.
• 图a)存在一条欧拉通路:v3v1v2v3v4v1; • 图(b)中存在欧拉回路v1v2v3v4v1v3v1,因而(b)是欧拉 图; • 图(c)中有欧拉回路v1v2v3v4v5v6v7v8v2v4v6v8v1因而(c) 是欧拉图。
有向欧拉图的判定
• 有向图存在欧拉回路的充要条件: 基图连通且所有顶点入度等于出度。 • 有向图存在欧拉路径的充要条件: 基图连通且存在某顶点入度比出度大1,另 一顶点出度比入度大1,其余顶点入度等于 出度。
欧拉回路存在性的判断
• 欧拉回路问题可以分为无向图中的欧拉回路和欧拉通路,有向图中 的欧拉回路和欧拉通路。这几个问题大抵相像。 • 有向欧拉回路有: • 定理:假设有像多重图D有性质:当忽略有向边上的方向时,得到 的图是连通的,那么D有有向欧拉回路当且仅当D的每个顶点的入 度和出度相等。 • 类似的,对有向欧拉通路有: • 定理:D有有向欧拉通路,当且仅当除两个不同顶点B和C之外, D的其它顶点的入度和出度相等,且B的出度比入度大1,C的入度 比出度大1。在这种情况下,有向欧拉通路自B出发,至C终止。 • 由上面的定理可以知道,如果要判断一个有向图的欧拉回路是否存 在,需要先判断连通性,再判断出度入度。对于无向图,判断方法 类似。 • 判断连通性可以通过DFS或者并查集来实现。
如果E的每一条边都是无向边, 则称G为无向 图(如图1); 如果E的每一条边都是有向边, 则称 G为有向图(如图2); 否则, 称G为混合图. 图 1 并且常记
V = {v1, v2, … , vn}, |V | = n ; E = {e1, e2, … , em}(ek=vivj ) , |E | = m.
例题一 单词游戏
• 有N个盘子,每个盘子上写着一个仅由小写 字母组成的英文单词。 • 你需要给这些盘子按照合适的顺序排成一 行,使得相邻两个盘子中,前一个盘子上 面单词的末字母等于后一个盘子上面单词 的首字母。 • 请你编写一个程序,判断是否能达到这一 要求。如果能,请给出一个合适的顺序。
样例
mouse
实例:PKU 2337
• 在没有特殊要求的情况下,DFS遍历图的结点顺序是可以任选的。但是这 里由于加上了字典序最小的要求,所以DFS遍历时需要按照以下的优先顺 序: • 1. 如果有不是桥的边,遍历这些边中字典序最小的边。 • 2. 否则,遍历这些这些桥中字典序最小的边。 • 比如一个单词,abcde,那么就连接一条a到e的有向边。如此构成的图 一共最多有26个节点。每条边都代表一个单词,那么就转化成了:找一 条路,遍历所有的边。就是欧拉通路问题。 • 遍历欧拉通路的方法: • 确定一个起点(出度-入度=1,或者等于0(如果存在欧拉回路的话)) • 从起点开始深搜(首先要保证图中存在欧拉回路或者通路) • dfs(vid, eid) • 其中vid表示当前搜到的点。eid表示当前搜到的边(一个点可能会有很多 边) • 对于每条边,都是等它搜索完了后,把它代表的内容(这里是单词)压入 一个栈中。 • 最后深搜结束后,依次弹栈就是答案。
求无向图欧拉回路的算法
1. 在图中任意找一个回路C;
2. 将图中属于C的边删除;
3. 在残留图的各个极大连通分量中求欧拉
回路;
4. 将各极大连通分量中的欧拉回路合并到
C上。
欧拉回路的构建
• • • • • • • • • • • 在构建欧拉回路之前需要判断欧拉回路是否存在。 构建欧拉回路可以使用Fleury算法(能不走桥就不走桥): Fleury算法: (1)任取v0∈V(G),令P0=v0; (2)设Pi=v0e1v1e2...eivi已经行遍,按下面方法来从 E(G)-{e1,e2,...,ei}中选取ei+1: (a)ei+1与vi想关联; (b)除非无别的边可供行遍,否则ei+1不应该为 Gi=G-{e1,e2,...,ei}中的桥. (3)当(2)不能再进行时,算法停止。 可以证明,当算法停止时所得简单回路Pm=v0e1v1e2...emvm( vm=v0)为G中的一条欧拉回路。


图论
什么是图?
C
A
B
哥尼斯堡七桥示意图
D
问题1(哥尼斯堡七桥问题): 能否从任一陆地出发通过每座桥恰好一次而 回到出发点?
C
A D
B
七桥问题模拟图
欧拉指出: 如果每块陆地所连接的桥都是偶数座,则 从任一陆地出发,必能通过每座桥恰好一次而 回到出发地. (——著名的欧拉图问题)
问题2(哈密顿环球旅行问题): 十二面体的20个顶点代表世界上20个城市, 能否从某个城市出发在十二面体上依次经过每个 城市恰好一次最后回到出发点?
(South Central USA 2002 )
• 大意:给定N(<=20)个房间,房间之间有门相隔,门的数 目不超过100道,当前人在第M个房门,当前人每经过一 道门的时候就把经过的门锁上,问有没有一条路可以使得 我们走到第0个房门的时候所有的门都锁上了。 • 思路:我们可以把门看成是两个房间之间的边,那么问题 可以转化成找一条欧拉路径。 • PS:判断的时候只要判断所有的边在一起就行了,所有 的点不一定连通,当0点和M点不连通的时候,无解。 • 注意这组数据。
图中,(3) 不是欧拉图, (4) 是欧 拉图.

a) 是欧拉图; b) 不是欧拉图,但存在欧拉通路; c) 即不是欧拉图,也不存在欧拉通路。
例1、(蚂蚁比赛问题)
甲、乙两只蚂蚁分别位 于如下图中的结点a,b 处,并设图中的边长度 是相等的。甲、乙进行 比赛:从它们所在的结 点出发,走过图中的所 有边最后到达结点c处 。如果它们的速度相同 ,问谁先到达目的地?
malform
acm
样例
m acm
m m malform
m mouse
模型
• 以26个英文字母作为顶点。 • 对于每一个单词,在图中从它的首字母向 末字母连一条有向边。
模型ຫໍສະໝຸດ Baidu
• 问题转化为在图中寻找一条不重复地经过 所有边的路径,即欧拉路径。 • 这个问题能够在O(|E|)时间内解决。
实例:PKU 2337
相关文档
最新文档