欧拉回路Word文档格式.docx
- 文档编号:18402842
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:11
- 大小:91.42KB
欧拉回路Word文档格式.docx
《欧拉回路Word文档格式.docx》由会员分享,可在线阅读,更多相关《欧拉回路Word文档格式.docx(11页珍藏版)》请在冰豆网上搜索。
(1)任取起始点
(2)设路
已选出,则从E\
中选出边
,使
相连,除非没有其它选择,
仍应为连通的.
(3)重复步骤
(2),直至不能进行下去为止.
定理2连通的有向图存在欧拉回路的充分必要条件是对任意节点,进入该节点边数(进数)与离开该点的边数(出数)相等.
三、中国邮递员问题
一名邮递员带着要分发的邮件从邮局出发,经过要分发的每个街道,送完邮件后又返回邮局.如果他必须至少一次走过他管辖范围内的每一条街道,如何选择投递路线,使邮递员走尽可能少的路程.这个问题是由我国数学家管梅谷先生(山东师范大学数学系教授)在1962年首次提出的,因此在国际上称之为中国邮递员问题.
用图论的述语,在一个连通的赋权图G(V,E)中,要寻找一条回路,使该回路包含G中的每条边至少一次,且该回路的权数最小.也就是说要从包含G的每条边的回路中找一条权数最小的回路.
如果G是欧拉图,则很容易由弗罗莱算法求出一个欧拉回路,但是若G不是欧拉图,即存在奇度数的节点,则中国由递员问题的解决要困难得多.本节的主要目标是给出在有奇度数节点的连通图中寻找最小权数的回路的方法.
首先注意到,若图G有奇数度节点,则G的奇数度节点必是偶数个.把奇数度节点分为若干对,每对节点之间在G中有相应的最短路,将这些最短路画在一起构成一个附加的边子集
.令G/=G+E/,即把附加边子集E/叠加在原图G上形成一个多重图G/,这时G/中连接两个节点之间的边不止一条.显然G/是一个欧拉图,因而可以求出G/的欧拉回路.该欧拉回路不仅通过原图G中每条边,同时还通过E/中的每条边,且均仅一次.邮递员问题的难点在于当G的奇数度节点较多时,可能有很多种配对方法,应怎样选择配对,能使相应的附加边子集E/的权数ω(E/)为最小?
为此有下列定理.
定理3设G(V,E)为一个连通的赋权图,则使附加边子集E/的权数ω(E/)为最小的充分必要条件是G+E/中任意边至多重复一次,且G+E/中的任意回路中重复边的权数之和不大于该回路总权数的一半.
证明:
必要性.用反证法.设存在一种奇节点集的配对,使其附加边子集E/权数ω(E/)为最小.若G+E/中有一条边重复
次,由于G+E/为欧拉图,所以删去相应的二次重复边后仍为欧拉图.这样,相应的附加边子集的权数将减小,这与ω(E/)为最小的假设矛盾.这说明E/中的边均互不相同.
其次,若G+E/中存在一个回路,使它的重复边的权数之和大于该回路总权数的一半,则在E/中删去这些重复边(注意:
这些边均在E/中),而代之以该回路的其余部分的边再重复一次.经过这种替代后所得到的边子集E//仍为附加子集,且ω(E//)<
ω(E/),又产生矛盾.
充分性.设有两个附加边子集E/和E//,均使G+E/和G+E//中每条边至多重复一次,且每个回路中的重复边的权数和不大该回路权数的一半,我们来证明ω(E/)=ω(E//).首先注意到,由E/和E//不相同的部分组成的图(记为
)是由一个或若干个欧拉子图所组成的.这是因为E/+E//中每个节点的度数均为偶数,而E/和E//的公共边数也是偶数,故
中每个节点的度数仍为偶数,所以它若为连通图时是一个欧拉图;
若为非连通图时则由若干个欧拉子图组成.
的任何回路都由E/和E//中的边组成,而E/和E//在回路中的权数分别不大于该回路权数的一半,因而任何回路中属于E/中的权数之和与属于E//中的边数之和必定相等,所以ω(E/)=ω(E//).它就是最优附加边子集的权数,即E/和E//均为使附加边子集的权数达到最小的最优附加边子集.
由定理3可得一个寻找邮递员问题最优解的方法.现举例如下:
例1
已知邮递员要投递的街道如图11-20所示,试求最优邮路.
解先找出奇节点:
A1,A2,A3,A4,B1,B2,B3,B4.奇节点进行配对,不妨把A1与B1,A2与B2,A3与B3,A4与B4配对,求其最短路.显然它不是最优解.下面我们根据定理3来进行调解.
第一次调整:
删去多于一条的重复边,即A3与B3,A4与B4中的(A4,B3).调整后,实际上成为A1与B1,A2与B2,A3与A4,B3与B4的配对,它们的最短路如图11-21所示.
第二次调整:
发现在回路{A1,A2,B2,A4,B3,B4,B1,A1}中重复边的权数和为11,大于该回路权数20的一半.因而调整时,把该回路的重复边删去,代之以重复其余部分,得图11-22.可以看出,实际上是调整为A1与A2,B1与B4,A3与A4,B2与B3配对.
第三次调整:
在图11-22中发现回路{A3,A4,B2,A3}中重复边的权数和为7,大于该回路权数10的一半,因而删去原重复边(A3,V2,A4)和(A4,B2),而添加(B2,A3),得到图11-23.进行检查发现,既没有多于一条的重复边,也没有任何回路使其重复边的权数之和大于该回路的一半,因此图11-23就是最优的附加边子集E/,而G+E/为欧拉图,可由弗罗莱算法找出最优邮路.
在现实生活中,很多问题都可以转化为中国邮递员问题,例如道路清扫时如何使开空车的总时间最少的问题等等.上面例1题所用的求最优邮路的方法叫“奇偶点图上作业法”.因为此方法要验证每个回路,很不方便,Edmods和Johnson在1973年提出一种比较有效的方法,有兴趣的读者可参考有关资料.
习题11-3
1.证明,若图G为欧拉图,则G的边数不少于节点数.
2.一名邮递员的投邮区,如下图11-24所示,每条边(街道)都有邮件需投递,各边旁所注的数字为该街道的长度,试求该邮区的最短投递路径及其长度.
3.求下列图11-25(a)(b)所示的投邮区的最佳邮路及其长度.
【算法】欧拉图,欧拉回路,EularCircuit,随机生成欧拉图,搜索欧拉回路
背景:
图论起源于18世纪,1736年瑞士数学家欧拉(Eular)发表了图论的第一篇论文“哥尼斯堡七桥问题”。
在当时的哥尼斯堡城有一条横贯全市的普雷格尔河,河中的两个岛与两岸用七座桥联结起来,见图
(1)。
当时那里的居民热衷于一个难题:
游人怎样不重复地走遍七桥,最后回到出发点。
为了解决这个问题,欧拉用ABCD四个字母代替陆地,作为4个顶点,将联结两块陆地的桥用相应的线段表示,如图
(2),于是哥尼斯堡七桥问题就变成了图
(2)中,是否存在经过每条边一次且仅一次,经过所有的顶点的回路问题了。
欧拉在论文中指出,这样的回路是不存在的。
1定义
欧拉通路(欧拉迹)——通过图中每条边一次且仅一次,并且过每一顶点的通路。
欧拉回路(欧拉闭迹)——通过图中每条边一次且仅一次,并且过每一顶点的回路。
欧拉图——存在欧拉回路的图。
2无向图是否具有欧拉通路或回路的判定
G有欧拉通路的充分必要条件为:
G连通,G中只有两个奇度顶点(它们分别是欧拉通路的两个端点)。
G有欧拉回路(G为欧拉图):
G连通,G中均为偶度顶点。
3有向图是否具有欧拉通路或回路的判定
D有欧拉通路:
D连通,除两个顶点外,其余顶点的入度均等于出度,这两个特殊的顶点中,一个顶点的入度比出度大1,另一个顶点的入度比出度小1。
D有欧拉回路(D为欧拉图):
D连通,D中所有顶点的入度等于出度。
欧拉通路、欧拉回路、欧拉图、半欧拉图的定义
定义15.1通过图(无向图或有向图)中所有边一次且仅一次行遍图中所有顶点的通路称为欧拉通路,通过图中所有边一次并且仅一次行遍所有顶点的回路称为欧拉回路。
具有欧拉回路的图称为欧拉图,具有欧拉通路而无欧拉回路的图称为半欧拉图。
从定义不难看出,欧拉通路是图中经过所有边的简单的生成通路(经过所有顶点的通路称为生成通路),类似地,欧拉回路是经过所有边的简单的生成回路。
在这里做个规定,即平凡图是欧拉图。
图15.1
在图15.1所示各图中,e1e2e3e4e5为
(1)中的欧拉回路,所以
(1)图为欧拉图。
e1e2e3e4e5为
(2)中的一条欧拉通路,但图中不存在欧拉回路(为什么?
),所以
(2)为半欧拉图。
(3)中既没有欧拉回路,也没有欧拉通路(为什么?
),所以(3)不是欧拉图,也不是半欧拉图。
e1e2e3e4为(4)图中的欧拉回路,所以(4)图为欧拉图。
(5),(6)图中都既没有欧拉回路,也没有欧拉通路
constmaxn=100;
var
g:
array[1..maxn,1..maxn]oflongint;
du:
array[1..maxn]oflongint;
circuit:
n,circuitpos,i,j,start,oddnumber:
longint;
proceduresetIO;
begin
assign(input,'
one.in'
);
reset(input);
assign(output,'
one.out'
rewrite(output);
end;
procedurefind_circuit(i:
longint);
varj:
forj:
=1tondo
ifg[i,j]=1then
begin
g[i,j]:
=0;
g[j,i]:
find_circuit(j);
end;
circuitpos:
=circuitpos+1;
circuit[circuitpos]:
=i;
//setIO;
read(n);
fori:
du[i]:
read(g[i,j]);
=du[i]+g[i,j];
start:
=1;
oddnumber:
ifdu[i]mod2=1then
=oddnumber+1;
if(oddnumber>
2)or(oddnumber=1)
thenwriteln('
NoSolution!
'
)
elsebegin
find_circuit(start);
=1tocircuitpos-1dowrite(circuit[i],'
--->
writeln(circuit[circuitpos]);
close(input);
close(output);
end.
SPFA
实现方法:
建立一个队列,初始时队列里只有起始点,在建立一个表格记录起始点到所有点的最短路径(该表格的初始值要赋为极大值,该点到他本身的路径赋为0)。
然后执行松弛操作,用队列里有的点去刷新起始点到所有点的最短路,如果刷新成功且被刷新点不在队列中则把该点加入到队列最后。
重复执行直到队列为空
判断有无负环:
如果某个点进入队列的次数超过N次则存在负环(SPFA无法处理带负环的图)
programspfaprg;
const
maxp=10000;
{最大结点数}
var{变量定义}
p,c,s,t:
{p,结点数;
c,边数;
s:
起点;
t:
终点}
a,b:
array[1..maxp,0..maxp]oflongint;
{a[x,y]存x,y之间边的权;
b[x,c]存与x相连的第c个边的另一个结点y}
d:
array[1..maxp]ofinteger;
{队列}
v:
array[1..maxp]ofboolean;
{是否入队的标记}
dist:
array[1..maxp]oflongint;
{到起点的最短路}
head,tail:
{队首/队尾指针}
procedureinit;
var
i,x,y,z:
read(p,c);
fori:
=1tocdo
readln(x,y,z);
{x,y:
一条边的两个结点;
z:
这条边的权值}
inc(b[x,0]);
b[x,b[x,0]]:
=y;
a[x,y]:
=z;
{b[x,0]:
以x为一个结点的边的条数}
inc(b[y,0]);
b[y,b[y,0]]:
=x;
a[y,x]:
readln(s,t);
{读入起点与终点}
procedurespfa(s:
{SPFA}
vari,,j,now,sum:
fillchar(d,sizeof(d),0);
fillchar(v,sizeof(v),false);
forj:
=1topdo
dist[j]:
=maxlongint;
dist[s]:
=0;
v[s]:
=true;
d[1]:
=s;
{队列的初始状态,s为起点}
head:
=1;
tail:
whilehead<
=taildo{队列不空}
now:
=d[head];
{取队首元素}
=1tob[now,0]do
ifdist[b[now,i]]>
dist[now]+a[now,b[now,i]]then
dist[b[now,i]]:
=dist[now]+a[now,b[now,i]];
{修改最短路}
ifnotv[b[now,i]]then{扩展结点入队}
inc(tail);
d[tail]:
=b[now,i];
v[b[now,i]]:
v[now]:
=false;
{释放结点}
inc(head);
{出队}
procedureprint;
writeln(dist[t]);
init;
spfa(s);
print;
end.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 回路
![提示](https://static.bdocx.com/images/bang_tan.gif)