FindEulerianCycle
更多信息
- 欧拉圈是对每条边恰好遍历一次的圈.
- FindEulerianCycle 返回由欧拉圈组成的路径列表.
- 如果不存在欧拉圈则 FindEulerianCycle 返回列表 {}.
- FindEulerianCycle[g] 等价于 FindEulerianCycle[g,1].
- FindEulerianCycle[g,All] 求图 g 中的所有欧拉圈.
- FindEulerianCycle 适用于无向图、有向图和多重图.
背景
- FindEulerianCycle 试图找出一个或多个不同的欧拉圈,也被称为图的欧拉环路,欧拉巡回或欧拉回路. 欧拉圈会作为边列表的列表返回,不存在时则返回 {}. 欧拉圈(若该圈被显式路径标明且路径由特定端点组成,则更适合被称为环路)是由不同边组成的一个连续序列,头尾两条边的端点是重合的且图的每条边都恰好出现一次. 欧拉圈可被用于重建基因组序列,构建 de Bruijin 序列,以及寻找最佳会议排期.
- FindEulerianCycle[g,k] 试图找出 k 个欧拉圈,其中计数要求 k 可以被省略(在这种情况下它取值为 1),或者也可以设为 All. 欧拉圈不必是简单圈,即圈中可以有重复的顶点(不像哈密尔顿圈,它总是简单的).
- 具有欧拉圈的图被称为欧拉图. 然而,这里需要谨慎的解释一下术语,因为有些作者把欧拉图定义为另一种东西,用来命名所有顶点都是偶数度的图. 后一定义是受欧拉的正确(但不是他证明的)观察启发,他注意到连通简单图有欧拉回路当且仅当没有一个顶点是奇数度的. 欧拉圈因此在数学上比哈密尔顿圈要容易研究些. 尽管连通情况下有
个结点的两种欧拉图数量是一样的,但不连通情况下数量就不一样了,因为存在不连通的图具有多个不连通的圈,它的每个结点都是偶数度的但没有单个的圈可以经过所有的边. - EulerianGraphQ 可被用于判定一个图是不是欧拉图. 寻找其它类型的圈的函数包括 FindCycle 和 FindHamiltonianCycle.
范例
打开所有单元 关闭所有单元基本范例 (2)
范围 (8)
FindEulerianCycle 可用于无向图:
FindEulerianCycle[[image]]FindEulerianCycle[[image]]FindEulerianCycle[[image]]FindEulerianCycle[[image], 2]FindEulerianCycle[[image], All]//LengthFindEulerianCycle[{1 -> 2, 2 -> 3, 3 -> 1, 1 -> 3, 3 -> 4, 4 -> 1}]FindEulerianCycle 对于非欧拉图返回空结果:
FindEulerianCycle[[image]]FindEulerianCycle 可用于大规模图:
g = HypercubeGraph[14];EdgeCount[g]FindEulerianCycle[g]//Short//Timing应用 (7)
普雷格尔河上柯尼斯堡市的七座桥不能无重复的由单条路径遍历,尤其还要求在和起点相同的地方结束行程:
graph = \!\(\*GraphicsBox[«6»]\);FindEulerianCycle[graph]描绘出一个信封的图案,并且无需抬起钢笔,无需两次划过同一条线:
g = [image];EulerianGraphQ[g]由于存在两个度数为奇数的顶点,通过经由一个新的顶点(以避免多重边)连接度数为奇数的顶点,可构建增广欧拉图:
{s, t} = Pick[VertexList[g], OddQ /@ VertexDegree[g]]h = Graph[Append[VertexList[g], "z"], Join[EdgeList[g], {t"z", "z"s}], VertexCoordinates -> Append[GraphEmbedding[g], {0., -0.8}], VertexSize -> Tiny, EdgeStyle -> {Dashed, t"z" -> Green, "z"s -> Green}]EulerianGraphQ[h]FindEulerianCycle[h]//FirstNestWhile[Append[#[[2 ;; ]], #[[1]]]&, %, Not[MemberQ[List@@#[[-2]], "z"]] || Not[MemberQ[List@@#[[-1]], "z"]]&]Table[HighlightGraph[g, Append[Style[#, Directive[StandardGray, Dashing[{}]]]& /@ %[[ ;; i - 1]], Style[%[[i]], Directive[Red, Dashing[{}]]]]], {i, Length[%] - 2}]g = [image];FindEulerianCycle[g]h = EdgeAdd[g, "Michael""William"];First[FindEulerianCycle[h]]TableForm[Apply[List, Rest[%], {1}], TableHeadings -> {Table[i, {i, 10}], None} ]由圆形基因组 "ATGGCGTGCA" 组成的基于图的组合,其中顶点作为 (k-1) 部,而边作为 k 部:
threeMers = StringJoin /@ Partition[Characters["ATGGCGTGCA"], 3, 1, 1]edges = DirectedEdge[StringDrop[#, -1], StringDrop[#, 1]]& /@ threeMersGraph[edges, GraphLayout -> "CircularEmbedding", PlotTheme -> "DiagramGold"]FindEulerianCycle [%]//FirstStringJoin[StringTake[First /@ %, 1]]g = DeBruijnGraph[2, 3]cycle = First[FindEulerianCycle[g]]First[IntegerDigits[# - 1, 2, 3]]& /@ cycle[[All, 1]]Graph[{12, 23, 31, 34, 45, 53, 55}]FindEulerianCycle [%]//FirstFirst /@ %g = GraphData[{"DutchWindmill", {3, 4}}];edges = First[FindEulerianCycle[g]]HighlightGraph[g, Table[Labeled[edges[[i]], i], {i, Length[edges]}]]属性和关系 (6)
对大量欧拉图集合使用 GraphData:
Short[GraphData["Eulerian"]]Short[GraphData["Noneulerian"]]利用 EulerianGraphQ 检验一个图是否含有欧拉圈:
GraphData[{"DutchWindmill", {2, 4}}]EulerianGraphQ[%]g = GraphData[{"Antiprism", 4}]VertexDegree[g]FindEulerianCycle[g]如果一个无向图可以被分解为边互不相交的圈,则该图含有欧拉圈:
g = Graph[{12, 23, 31, 34, 45, 53}]Subgraph[g, #]& /@ {{1, 2, 3}, {3, 4, 5}}g = CompleteGraph[{2, 4}]{EulerianGraphQ[g], FindEulerianCycle[LineGraph[g]]}当且仅当每个顶点具有相等的入度和出度时,一个有向图才含有欧拉圈:
g = Graph[{12, 23, 31, 34, 41, 13}]{ConnectedGraphQ[g], VertexInDegree[g] == VertexOutDegree[g]}FindEulerianCycle[g]巧妙范例 (1)
g = [image];Shallow[cycle = First[FindEulerianCycle[g]]]color[cycles_] := {cycles, cycles[[All, 1]], Style[cycles[[-1, 2]], Yellow]}Dynamic[HighlightGraph[g, color[cycle[[1 ;; Clock[{1, Length[cycle], 1}, 40]]]]]]相关指南
-
▪
- 路径、圈与流
文本
Wolfram Research (2010),FindEulerianCycle,Wolfram 语言函数,https://reference.wolfram.com/language/ref/FindEulerianCycle.html (更新于 2015 年).
CMS
Wolfram 语言. 2010. "FindEulerianCycle." Wolfram 语言与系统参考资料中心. Wolfram Research. 最新版本 2015. https://reference.wolfram.com/language/ref/FindEulerianCycle.html.
APA
Wolfram 语言. (2010). FindEulerianCycle. Wolfram 语言与系统参考资料中心. 追溯自 https://reference.wolfram.com/language/ref/FindEulerianCycle.html 年
BibTeX
@misc{reference.wolfram_2026_findeuleriancycle, author="Wolfram Research", title="{FindEulerianCycle}", year="2015", howpublished="\url{https://reference.wolfram.com/language/ref/FindEulerianCycle.html}", note=[Accessed: 14-September-2026]}
BibLaTeX
@online{reference.wolfram_2026_findeuleriancycle, organization={Wolfram Research}, title={FindEulerianCycle}, year={2015}, url={https://reference.wolfram.com/language/ref/FindEulerianCycle.html}, note=[Accessed: 14-September-2026]}