グラフ g のオイラー(Euler)閉路を求める.
FindEulerianCycle[g,k]
最高で k 個のオイラー閉路を求める.
FindEulerianCycle[{vw,…},…]
規則 vw を使ってグラフ g を指定する.
FindEulerianCycle
グラフ g のオイラー(Euler)閉路を求める.
FindEulerianCycle[g,k]
最高で k 個のオイラー閉路を求める.
FindEulerianCycle[{vw,…},…]
規則 vw を使ってグラフ g を指定する.
詳細
- オイラー閉路はすべての辺を厳密に1回通る閉路である.
- FindEulerianCycleはオイラー閉路からなる経路のリストを返す.
- FindEulerianCycleはオイラー閉路が存在しない場合にはリスト{}を返す.
- FindEulerianCycle[g]は FindEulerianCycle[g,1]に等しい.
- FindEulerianCycle[g,All]は,グラフ g 内のすべてのオイラー閉路を求める.
- FindEulerianCycleは,無向グラフ,有向グラフ,多重グラフに使うことができる.
予備知識
- FindEulerianCycleは,グラフ内の他と区別できる1つ以上のオイラー閉路(オイラー回路,オイラー路とも呼ばれる)を見付けようと試みる.閉路は,辺リストのリストとして,あるいは見付からない場合には{}として返される.オイラー閉路(閉路が特定の端点を持つ明示的な経路を使って識別される場合には,より正しくはオイラー回路と呼ばれる)は,最初と最後の辺が端点で繋がり,各辺が厳密に1度だけ現れるような,互いに区別の付く辺の連続する列である.オイラー閉路は,ゲノム配列を再構築したり,de Bruijn配列を構築したり,最適な学会のスケジューリングを求めたりするのに使える.
- FindEulerianCycle[g,k]は,k 個のオイラー閉路を求めようと試みる.オイラー閉路では,回数指定 k を省略する(その場合には1であるとみなされる)場合も,正の整数の場合も,あるいはAllになる場合もある.オイラー閉路は,単純な閉路である必要はない.つまり,(必ず単純であるハミルトン(Hamilton)閉路とは違って)閉路内で頂点が繰り返されてもよい.
- オイラー閉路を含むグラフはオイラーグラフと呼ばれる.ただし,「Euler」と「Eulerian」で使い分けて,つまり「Euler graph」ですべての頂点が偶次数であるグラフを指すとする場合もあるので注意が必要である.後者の定義は,連結した単純グラフは奇次数の頂点がない場合,かつその場合に限り,オイラー回路を持つというオイラーの正しい(彼自身によって証明されることはなかった)観察によるものである.オイラー閉路はこのため,ハミルトン(Hamiltonian)閉路よりも数学的に研究しやすい.
個のノードを持つ連結したオイラー(Euler)グラフの数は,
個のノードを持つ連結したオイラー(Eulerian)グラフの数と等しいが,非連結のグラフについては数が異なる.どの閉路もすべての辺を通らないという場合でも,各ノードで複数の非連結の閉路を持つ非連結グラフが存在するからである. - EulerianGraphQは,グラフがオイラー(Eulerian)グラフであるかどうかを判断するのに使える.他の種類の閉路を見付けるための関数として,FindCycleとFindHamiltonianCycleがある.
例題
すべて開く すべて閉じる例 (2)
g = GraphData["OctahedralGraph"];FindEulerianCycle[g]Table[HighlightGraph[g, Part[First[%], 1 ;; i]], {i, Length[First[%]]}]FindEulerianCycle[GraphData["ButterflyGraph"], 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)
ケーニヒスベルクのプレーゲル河に架かる7つの橋を2度通らずすべて1度だけ通ってもとの場所に戻ることはできない:
graph = \!\(\*GraphicsBox[«6»]\);FindEulerianCycle[graph]g = [image];EulerianGraphQ[g]奇点が2つあるので(多重辺を避けるために)新たな頂点を通して奇点を繋いで拡張したオイラーグラフを作ることができる:
{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]//First頂点
を含む辺が最後になるまでオイラー閉路の辺を回転させる:
NestWhile[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];1人が連続する2つの会議の両方に出席できるような最適のスケジュールはない:
FindEulerianCycle[g]h = EdgeAdd[g, "Michael""William"];First[FindEulerianCycle[h]]TableForm[Apply[List, Rest[%], {1}], TableHeadings -> {Table[i, {i, 10}], None} ]頂点が長さ(k-1)の部分配列で辺が長さ k の部分配列である,環状ゲノム"ATGGCGTGCA"のグラフに基づいたアセンブリ:
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]]オイラー閉路から k 分木のde Bruijn系列を構築する:
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 /@ %オランダの風車グラフ(Dutch Windmill graph)のオイラーグラフを求める:
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 Language. 2010. "FindEulerianCycle." Wolfram Language & System Documentation Center. Wolfram Research. Last Modified 2015. https://reference.wolfram.com/language/ref/FindEulerianCycle.html.
APA
Wolfram Language. (2010). FindEulerianCycle. Wolfram Language & System Documentation Center. Retrieved from 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: 16-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: 16-September-2026]}