<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://demowiki.knowlus.com/index.php?action=history&amp;feed=atom&amp;title=Eulerkreisproblem</id>
	<title>Eulerkreisproblem - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://demowiki.knowlus.com/index.php?action=history&amp;feed=atom&amp;title=Eulerkreisproblem"/>
	<link rel="alternate" type="text/html" href="https://demowiki.knowlus.com/index.php?title=Eulerkreisproblem&amp;action=history"/>
	<updated>2026-04-04T16:06:50Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Demo Wiki</subtitle>
	<generator>MediaWiki 1.44.2</generator>
	<entry>
		<id>https://demowiki.knowlus.com/index.php?title=Eulerkreisproblem&amp;diff=9225&amp;oldid=prev</id>
		<title>imported&gt;Legov20: /* Geschichte */ Korrektur</title>
		<link rel="alternate" type="text/html" href="https://demowiki.knowlus.com/index.php?title=Eulerkreisproblem&amp;diff=9225&amp;oldid=prev"/>
		<updated>2025-04-09T08:57:33Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Geschichte: &lt;/span&gt; Korrektur&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Datei:Hierholzer (5).png|mini|In kantendisjunkte Kreise zerlegter Eulergraph. Eine Eulertour der Knotenfolge (1, 2, 3, 1, 8, 7, 6, 9, 5, 4, 9, 7, 4, 3, 7, 1) ist in alphabetischer Reihenfolge angegeben.]]&lt;br /&gt;
&lt;br /&gt;
Ein &amp;#039;&amp;#039;&amp;#039;Eulerkreis&amp;#039;&amp;#039;&amp;#039; (auch geschlossener &amp;#039;&amp;#039;&amp;#039;Eulerzug&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;Eulertour&amp;#039;&amp;#039;&amp;#039;) ist in der [[Graphentheorie]] ein [[Zyklus (Graphentheorie)|Zyklus]], der alle [[Kante (Graphentheorie)|Kanten]] eines [[Graph (Graphentheorie)|Graphen]] genau einmal enthält.&lt;br /&gt;
&lt;br /&gt;
Ein &amp;#039;&amp;#039;offener Eulerzug&amp;#039;&amp;#039; (auch &amp;#039;&amp;#039;Eulerpfad&amp;#039;&amp;#039; oder &amp;#039;&amp;#039;Eulerweg&amp;#039;&amp;#039;) ist gegeben, wenn Start- und Endknoten nicht gleich sein müssen, wenn also statt eines [[Zyklus (Graphentheorie)|Zyklus]] lediglich eine [[Weg (Graphentheorie)|Kantenfolge]] verlangt wird, welche jede Kante des Graphen genau einmal enthält. Ein bekanntes Beispiel ist das „[[#Das Haus vom Nikolaus|Haus vom Nikolaus]]“.&lt;br /&gt;
&lt;br /&gt;
Ein [[zusammenhängender Graph]], der einen &amp;#039;&amp;#039;Eulerkreis&amp;#039;&amp;#039; besitzt, heißt &amp;#039;&amp;#039;eulerscher Graph&amp;#039;&amp;#039;. Enthält ein Graph lediglich einen Eulerweg und keinen Eulerkreis, so heißt er &amp;#039;&amp;#039;semi-eulerscher Graph&amp;#039;&amp;#039;. Die Aufgabe, zu einem gegebenen Graph zu bestimmen, ob dieser eulersch ist oder nicht, wird als &amp;#039;&amp;#039;&amp;#039;Eulerkreisproblem&amp;#039;&amp;#039;&amp;#039; bezeichnet. Es geht auf das 1736 von [[Leonhard Euler]] gelöste [[Königsberger Brückenproblem]] zurück. Das Problem existiert auch für [[Gerichteter Graph|gerichtete Graphen]] und [[Graph mit Mehrfachkanten|Graphen mit Mehrfachkanten]].&lt;br /&gt;
&lt;br /&gt;
Entgegen seinem Namen ist der Eulerkreis kein [[Kreis (Graphentheorie)|Kreis]], zumindest wenn der häufigen Definition gefolgt wird, nach der sich in einem Kreis kein [[Knoten (Graphentheorie)|Knoten]] wiederholen darf.&lt;br /&gt;
&lt;br /&gt;
== Geschichte ==&lt;br /&gt;
Leonhard Euler fragte in seiner Arbeit 1736 zum Königsberger Brückenproblem – übersetzt in die heutige Fachsprache –, ob der durch die [[Pregel]]brücken der Stadt gegebene Graph ein semi-eulerscher Graph ist, das heißt, ob ein Eulerweg existiert, und verneinte dies, da der Graph mehr als zwei Knoten mit ungeradem Grad hatte. Euler bewies, dass ein semi-eulerscher Graph höchstens zwei Knoten ungeraden [[Grad (Graphentheorie)|Grades]] haben kann.&amp;lt;ref&amp;gt;{{Literatur |Autor=Brian Hopkins, Robin J. Wilson |Titel=The Truth about Königsberg |Sammelwerk=The College Mathematics Journal |Band=35 |Datum=2004 |Nummer=3 |DOI=10.1080/07468342.2004.11922073 |Fundstelle=Paragraphen 20 und 21}}&amp;lt;/ref&amp;gt; Er vermutete und gab ohne Beweis an, dass dies eine hinreichende Bedingung sei: Ein zusammenhängender Graph, in dem jeder Knoten geraden Grad hat, ist ein Eulergraph. Ein Beweis des Satzes wurde zuerst von [[Carl Hierholzer]] 1873 veröffentlicht.&amp;lt;ref&amp;gt;Hierholzer &amp;#039;&amp;#039;Über die Möglichkeit, einen Linienzug ohne Wiederholung und ohne Unterbrechung zu umfahren&amp;#039;&amp;#039;, Mathematische Annalen, Bd. 6, 1873, S. 30–32, [https://zenodo.org/record/1447429/files/article.pdf Online]&amp;lt;/ref&amp;gt; Auf dem Beweis basiert der [[Algorithmus von Hierholzer]] zum Auffinden eines Eulerwegs.&lt;br /&gt;
&lt;br /&gt;
== Charakterisierung ==&lt;br /&gt;
Nach dem Satz von Euler-Hierholzer sind eulersche Graphen leicht zu charakterisieren.&lt;br /&gt;
&lt;br /&gt;
Sei &amp;#039;&amp;#039;G&amp;#039;&amp;#039; ein Graph, bei dem höchstens eine Zusammenhangskomponente Kanten enthält. Dann sind folgende Aussagen äquivalent:&lt;br /&gt;
# &amp;#039;&amp;#039;G&amp;#039;&amp;#039; ist eulersch,&lt;br /&gt;
# jeder Knoten in &amp;#039;&amp;#039;G&amp;#039;&amp;#039; hat [[Parität (Mathematik)|geraden]] Grad.&lt;br /&gt;
# die Kantenmenge von &amp;#039;&amp;#039;G&amp;#039;&amp;#039; ist die [[Vereinigungsmenge]] aller Kanten von [[paarweise disjunkt]]en Kreisen.&lt;br /&gt;
&lt;br /&gt;
Analog sind für einen [[Gerichteter Graph|gerichteten Graphen]] &amp;#039;&amp;#039;G&amp;#039;&amp;#039;, bei dem höchstens eine [[Zusammenhang (Graphentheorie)#Gerichtete Graphen|starke Zusammenhangskomponente]] Kanten enthält, folgende Aussagen äquivalent:&lt;br /&gt;
# &amp;#039;&amp;#039;G&amp;#039;&amp;#039; ist eulersch,&lt;br /&gt;
# für jeden Knoten in &amp;#039;&amp;#039;G&amp;#039;&amp;#039; sind [[Eingangsgrad]] und [[Ausgangsgrad]] gleich.&lt;br /&gt;
# die Kantenmenge von &amp;#039;&amp;#039;G&amp;#039;&amp;#039; ist die [[Vereinigungsmenge]] aller Kanten von paarweise disjunkten [[Gerichteter Kreis|gerichteten Kreisen]].&lt;br /&gt;
&lt;br /&gt;
== Verallgemeinerung: Eulerweg ==&lt;br /&gt;
Ein [[Ungerichteter Graph|ungerichteter]] [[zusammenhängender Graph]] enthält [[Genau dann, wenn|genau dann]] einen Eulerweg, wenn zwei oder keiner seiner Knoten von ungeradem Grad sind. Hat &amp;#039;&amp;#039;kein&amp;#039;&amp;#039; Knoten einen ungeraden Grad, handelt es sich bei jedem Eulerweg um einen Eulerkreis.&lt;br /&gt;
&lt;br /&gt;
== Entscheidungsproblem ==&lt;br /&gt;
Die Frage, ob für einen gegebenen Graph ein Eulerkreis existiert, lässt sich algorithmisch relativ leicht lösen, da ein Graph genau dann eulersch ist, wenn er [[Zusammenhängender Graph|zusammenhängend]] ist und jeder Knoten geraden Grad besitzt. Mittels [[Tiefensuche]] lässt sich dies leicht in linearer Zeit feststellen.&lt;br /&gt;
&lt;br /&gt;
== Auffinden eines Eulerkreises ==&lt;br /&gt;
Zum Auffinden eines Eulerkreises existieren mehrere Verfahren. Der Algorithmus von Fleury stammt aus dem Jahr 1883 und verfolgt einen sehr einfachen Ansatz, weshalb er eine [[Laufzeit (Informatik)|Laufzeit]] von der Größenordnung &amp;lt;math&amp;gt; \mathcal{O}(|E|^2) &amp;lt;/math&amp;gt; hat. &lt;br /&gt;
&lt;br /&gt;
Effizienter ist der [[Algorithmus von Hierholzer]], der einen Eulerkreis in Linearzeit berechnet.&lt;br /&gt;
&lt;br /&gt;
=== Algorithmus von Fleury ===&lt;br /&gt;
Im Algorithmus von Fleury spielen Brückenkanten eine wichtige Rolle. Das sind Kanten, ohne die der Graph in zwei Komponenten zerfallen würde.&lt;br /&gt;
&lt;br /&gt;
Der Algorithmus fügt einer anfangs leeren Kantenfolge alle Kanten eines Graphen hinzu, sodass ein Eulerkreis entsteht.&lt;br /&gt;
# Wähle einen beliebigen Knoten als aktuellen Knoten.&lt;br /&gt;
# Wähle unter den unmarkierten, mit dem aktuellen Knoten inzidenten Kanten eine beliebige Kante aus. Dabei sind zuerst Kanten zu wählen, die im unmarkierten Graphen keine Brückenkanten sind.&lt;br /&gt;
# Markiere die gewählte Kante und füge sie der Kantenfolge hinzu.&lt;br /&gt;
# Wähle den anderen Knoten der gewählten Kante als neuen aktuellen Knoten.&lt;br /&gt;
# Wenn noch unmarkierte Kanten existieren, dann gehe zu Schritt 2.&lt;br /&gt;
&lt;br /&gt;
Ob eine Kante eine Brückenkante ist, kann mittels [[Tiefensuche]] in Laufzeit &amp;lt;math&amp;gt; \mathcal{O}(|E|) &amp;lt;/math&amp;gt; überprüft werden. Da pro Schritt eine Kante entfernt wird, werden &amp;lt;math&amp;gt; \left| E \right| &amp;lt;/math&amp;gt; Iterationen benötigt. Die Anzahl der pro Iteration geprüften Kanten entspricht dem Grad des aktuellen Knotens. Insgesamt kann die gesamte Anzahl überprüfter Kanten durch &amp;lt;math&amp;gt; \mathcal{O}(|E|) &amp;lt;/math&amp;gt; beschränkt werden. Die gesamte Laufzeit ist damit von der Größenordnung &amp;lt;math&amp;gt; \mathcal{O}(|E|^2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Programmierung ====&lt;br /&gt;
Das folgende Beispiel in der [[Programmiersprache]] [[C-Sharp|C#]] zeigt die Implementierung des Algorithmus von Fleury für einen [[Ungerichteter Graph|ungerichteten Graphen]]. Der ungerichtete Graph wird als [[Klasse (Objektorientierung)|Klasse]] &amp;#039;&amp;#039;UndirectedGraph&amp;#039;&amp;#039; deklariert. Bei der Ausführung des Programms wird die [[Methode (Programmierung)|Methode]] &amp;#039;&amp;#039;Main&amp;#039;&amp;#039; verwendet, die den Eulerkreis oder Eulerpfad auf der Konsole ausgibt.&amp;lt;ref name=&amp;quot;:0&amp;quot;&amp;gt;GeeksforGeeks: [https://www.geeksforgeeks.org/fleurys-algorithm-for-printing-eulerian-path/ Fleury’s Algorithm for printing Eulerian Path or Circuit]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable left mw-collapsible mw-collapsed font-size: 105.3%;&amp;quot;&lt;br /&gt;
|style=&amp;quot;text-align:left; font-size: 95%;&amp;quot;| &amp;#039;&amp;#039;&amp;#039;Code-Schnipsel&amp;#039;&amp;#039;&amp;#039;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot;&amp;gt;&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
&lt;br /&gt;
// Deklariert die Klasse für die Knoten des Graphen&lt;br /&gt;
class Node&lt;br /&gt;
{&lt;br /&gt;
	public int index;&lt;br /&gt;
	public string value;&lt;br /&gt;
	public HashSet&amp;lt;Node&amp;gt; adjacentNodes = new HashSet&amp;lt;Node&amp;gt;(); // Menge der Nachbarknoten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Deklariert die Klasse für den ungerichteten Graphen&lt;br /&gt;
class UndirectedGraph&lt;br /&gt;
{&lt;br /&gt;
	public HashSet&amp;lt;Node&amp;gt; nodes = new HashSet&amp;lt;Node&amp;gt;();&lt;br /&gt;
	&lt;br /&gt;
	// Diese Methode verbindet die Knoten node1 und node2 miteinander.&lt;br /&gt;
	public void ConnectNodes(Node node1, Node node2)&lt;br /&gt;
	{&lt;br /&gt;
		node1.adjacentNodes.Add(node2);&lt;br /&gt;
		node2.adjacentNodes.Add(node1);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// Diese Methode trennt die Knoten node1 und node2 voneinander.&lt;br /&gt;
	public void DisconnectNodes(Node node1, Node node2)&lt;br /&gt;
	{&lt;br /&gt;
		node1.adjacentNodes.Remove(node2);&lt;br /&gt;
		node2.adjacentNodes.Remove(node1);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class Program&lt;br /&gt;
{&lt;br /&gt;
	// Diese Methode gibt die Eulerpfad, die als Liste von Knoten übergeben wird, in der Form (A, B), (B, C), (C, D), ... als Text zurück.&lt;br /&gt;
	public static string EulerPathToString(List&amp;lt;Node&amp;gt; nodeList)&lt;br /&gt;
	{&lt;br /&gt;
		string text = &amp;quot;&amp;quot;;&lt;br /&gt;
		for (int i = 0; i &amp;lt; nodeList.Count - 1; i++) // for-Schleife, die die Knoten durchläuft&lt;br /&gt;
		{&lt;br /&gt;
			text += &amp;quot;(&amp;quot; + nodeList[i].value + &amp;quot;, &amp;quot; + nodeList[i + 1].value + &amp;quot;), &amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		text = text.Substring(0, text.Length - 2);&lt;br /&gt;
		return text;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// Diese Methode gibt die Liste der durchlaufenen Knoten zurück&lt;br /&gt;
	public static List&amp;lt;Node&amp;gt; GetEulerPathByFleury(UndirectedGraph undirectedGraph, Node startNode)&lt;br /&gt;
	{&lt;br /&gt;
		// Behandelt den Fall, dass es zwei Knoten mit ungeradem Grad gibt und sucht einen Knoten mit ungeradem Grad&lt;br /&gt;
		foreach (Node node in undirectedGraph.nodes) // foreach-Schleife, die alle Knoten des Graphen durchläuft&lt;br /&gt;
		{&lt;br /&gt;
			if (node.adjacentNodes.Count % 2 == 1) // Wenn der Grad des aktuellen Knoten ungerade ist&lt;br /&gt;
			{&lt;br /&gt;
				startNode = node; // Knoten als Startknoten auswählen und foreach-Schleife verlassen&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		List&amp;lt;Node&amp;gt; nodeList = new List&amp;lt;Node&amp;gt;(); // Initialisiert die Liste der durchlaufenen Knoten&lt;br /&gt;
		Node nextNode = null; // Referenz auf den jeweils nächsten Knoten der Eulerpfad, die gegebenenfalls nach dem vollständigen Durchlaufen der Kanten für den letzten Knoten (Zielknoten) benötigt wird.&lt;br /&gt;
		AddNextEulerPathNode(undirectedGraph, startNode, ref nextNode, nodeList); // Aufruf der rekursiven Methode, die jeweils den nächsten Knoten hinzufügt&lt;br /&gt;
		if (nextNode != null)&lt;br /&gt;
		{&lt;br /&gt;
			nodeList.Add(nextNode); // Wenn Referenz nicht null, Zielknoten hinzufügen&lt;br /&gt;
		}&lt;br /&gt;
		return nodeList;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// Rekursive Methode, die jeweils den nächsten Knoten hinzufügt&lt;br /&gt;
	private static void AddNextEulerPathNode(UndirectedGraph undirectedGraph, Node startNode, ref Node nextNode, List&amp;lt;Node&amp;gt; nodeList)&lt;br /&gt;
	{&lt;br /&gt;
		HashSet&amp;lt;Node&amp;gt; adjacentNodes = new HashSet&amp;lt;Node&amp;gt;(startNode.adjacentNodes);&lt;br /&gt;
		foreach (Node node in adjacentNodes)&lt;br /&gt;
		{&lt;br /&gt;
			if (startNode.adjacentNodes.Contains(node) &amp;amp;&amp;amp; IsValidNextEdge(undirectedGraph, startNode, node))&lt;br /&gt;
			{&lt;br /&gt;
				nextNode = node;&lt;br /&gt;
				nodeList.Add(startNode);&lt;br /&gt;
				undirectedGraph.DisconnectNodes(startNode, node);&lt;br /&gt;
				AddNextEulerPathNode(undirectedGraph, node, ref nextNode, nodeList); // Rekursiver Aufruf der Methode&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// Diese Methode prüft, ob sich mit der aktuellen Kante die Eulerpfad vervollständigen lässt&lt;br /&gt;
	private static bool IsValidNextEdge(UndirectedGraph undirectedGraph, Node node1, Node node2)&lt;br /&gt;
	{&lt;br /&gt;
		if (node1.adjacentNodes.Count == 1 &amp;amp;&amp;amp; node1.adjacentNodes.Contains(node2))&lt;br /&gt;
		{&lt;br /&gt;
			return true;&lt;br /&gt;
		}&lt;br /&gt;
		HashSet&amp;lt;Node&amp;gt; visitedNodes = new HashSet&amp;lt;Node&amp;gt;();&lt;br /&gt;
		DepthFirstSearch(node1, visitedNodes);&lt;br /&gt;
		int count1 = visitedNodes.Count;&lt;br /&gt;
		&lt;br /&gt;
		undirectedGraph.DisconnectNodes(node1, node2);&lt;br /&gt;
		&lt;br /&gt;
		visitedNodes.Clear();&lt;br /&gt;
		DepthFirstSearch(node1, visitedNodes);&lt;br /&gt;
		int count2 = visitedNodes.Count;&lt;br /&gt;
		&lt;br /&gt;
		undirectedGraph.ConnectNodes(node1, node2);&lt;br /&gt;
		&lt;br /&gt;
		return count1 == count2;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// Diese Methode verwendet Tiefensuche, um alle erreichbaren Knoten des Graphen zu durchlaufen&lt;br /&gt;
	private static void DepthFirstSearch(Node startNode, HashSet&amp;lt;Node&amp;gt; visitedNodes)&lt;br /&gt;
	{&lt;br /&gt;
		visitedNodes.Add(startNode); // Fügt den aktuellen Knoten der Menge der markierten Knoten hinzu&lt;br /&gt;
		foreach (Node node in startNode.adjacentNodes) // foreach-Schleife, die alle benachbarten Knoten des Knotens durchläuft&lt;br /&gt;
		{&lt;br /&gt;
			if (!visitedNodes.Contains(node)) // Wenn der Knoten noch nicht markiert wurde&lt;br /&gt;
			{&lt;br /&gt;
				DepthFirstSearch(node, visitedNodes); // Rekursiver Aufruf der Methode mit dem Nachbarknoten als Startknoten&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// Hauptmethode, die das Programm ausführt&lt;br /&gt;
	public static void Main()&lt;br /&gt;
	{&lt;br /&gt;
		// Deklariert und initialisiert 5 Knoten&lt;br /&gt;
		Node node1 = new Node{index = 0, value = &amp;quot;A&amp;quot;};&lt;br /&gt;
		Node node2 = new Node{index = 1, value = &amp;quot;B&amp;quot;};&lt;br /&gt;
		Node node3 = new Node{index = 2, value = &amp;quot;C&amp;quot;};&lt;br /&gt;
		Node node4 = new Node{index = 3, value = &amp;quot;D&amp;quot;};&lt;br /&gt;
		Node node5 = new Node{index = 4, value = &amp;quot;E&amp;quot;};&lt;br /&gt;
		// Deklariert und initialisiert ein Array mit den Knoten&lt;br /&gt;
		Node[] nodes = {node1, node2, node3, node4, node5};&lt;br /&gt;
		// Erzeugt einen ungerichteten Graphen&lt;br /&gt;
		UndirectedGraph undirectedGraph = new UndirectedGraph();&lt;br /&gt;
		int numberOfNodes = nodes.Length;&lt;br /&gt;
		for (int i = 0; i &amp;lt; numberOfNodes; i++) // for-Schleife, die alle Knoten durchläuft&lt;br /&gt;
		{&lt;br /&gt;
			undirectedGraph.nodes.Add(nodes[i]); // Fügt die Knoten dem Graphen hinzu&lt;br /&gt;
		}&lt;br /&gt;
		// Verbindet Knoten des Graphen miteinander&lt;br /&gt;
		undirectedGraph.ConnectNodes(node2, node1);&lt;br /&gt;
		undirectedGraph.ConnectNodes(node1, node3);&lt;br /&gt;
		undirectedGraph.ConnectNodes(node3, node2);&lt;br /&gt;
		undirectedGraph.ConnectNodes(node1, node4);&lt;br /&gt;
		undirectedGraph.ConnectNodes(node4, node5);&lt;br /&gt;
		undirectedGraph.ConnectNodes(node4, node3);&lt;br /&gt;
		undirectedGraph.ConnectNodes(node4, node2);&lt;br /&gt;
		undirectedGraph.ConnectNodes(node3, node5);&lt;br /&gt;
		List&amp;lt;Node&amp;gt; eulerPath = GetEulerPathByFleury(undirectedGraph, node1); // Aufruf der Methode, die die Liste der durchlaufenen Knoten zurückgibt&lt;br /&gt;
		if (eulerPath.Count == 9) // Wenn die Anzahl der durchlaufenen Knoten um 1 größer als die Anzahl aller Kanten ist&lt;br /&gt;
		{&lt;br /&gt;
			string eulerPathText = EulerPathToString(eulerPath); // Aufruf der Methode&lt;br /&gt;
			Console.WriteLine(eulerPathText); // Ausgabe auf der Konsole&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			Console.WriteLine(&amp;quot;Es existiert kein Eulerpfad.&amp;quot;); // Ausgabe auf der Konsole&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		Console.ReadLine();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Hinweise&amp;#039;&amp;#039;&amp;#039;: Sowohl für das [[Referenz (Programmierung)|Referenzieren]] der [[Knoten (Graphentheorie)|Knoten]] des [[Ungerichteter Graph|ungerichteten Graphen]] als auch für das Referenzieren der [[Nachbarknoten]] jedes Knoten wird ein &amp;#039;&amp;#039;HashSet&amp;#039;&amp;#039; ([[Menge (Datenstruktur)|Menge]]) als [[Datentyp]] verwendet und mit [[Foreach-Schleife|&amp;#039;&amp;#039;foreach&amp;#039;&amp;#039;-Schleifen]] durchlaufen. Der Vorteil des &amp;#039;&amp;#039;HashSet&amp;#039;&amp;#039; für die Nachbarknoten im Vergleich zu einer [[Liste (Datenstruktur)|Liste]] ist, dass dann meist viel schneller, nämlich mit konstanter [[Laufzeit (Informatik)|Laufzeit]], geprüft werden kann, ob ein bestimmter Knoten Nachbarknoten eines anderen Knoten ist (siehe [[Hashtabelle#Vorteile 2|Hashtabelle – Vorteile]]). Ein Nachteil ist, dass dann die [[Reihenfolge]] der durchlaufenen Knoten in den [[Foreach-Schleife|&amp;#039;&amp;#039;foreach&amp;#039;&amp;#039;-Schleifen]] und damit auch die Reihenfolge der ausgegebenen Knoten des Eulerpfads nicht [[Eindeutigkeit|eindeutig]] oder teilweise [[Zufall|zufällig]] ist.&lt;br /&gt;
&lt;br /&gt;
Im Programmbeispiel wird nur einer der möglichen Eulerpfade bestimmt und ausgegeben, falls einer existiert.&lt;br /&gt;
&lt;br /&gt;
Statt dem &amp;#039;&amp;#039;HashSet&amp;#039;&amp;#039; ([[Menge (Datenstruktur)|Menge]]) &amp;#039;&amp;#039;visitedNodes&amp;#039;&amp;#039; kann auch eine [[Liste]] oder ein [[Feld (Datentyp)|Array]] vom Typ &amp;#039;&amp;#039;bool&amp;#039;&amp;#039; ([[Boolesche Variable]]) verwendet werden, wie im Einzelnachweis gezeigt.&amp;lt;ref name=&amp;quot;:0&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Vermutung von Hajos ==&lt;br /&gt;
Nach der im Allgemeinen ungelösten Zyklenvermutung von [[György Hajós]] über Kreiszerlegung von [[Eulergraph]]en von 1968 können Eulergraphen mit &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; Knoten in höchstens &amp;lt;math&amp;gt;\frac{1}{2} (n-1)&amp;lt;/math&amp;gt; Kreise zerlegt werden. Die Vermutung wurde für kleine Graphen (&amp;lt;math&amp;gt;n \leq 12&amp;lt;/math&amp;gt;) 2017 bewiesen&amp;lt;ref&amp;gt;[https://arxiv.org/abs/1705.08724 Irene Heinrich, Marco Natale, Manuel Streicher, Hajós&amp;#039; cycle conjecture for small graphs], Arxiv 2017&amp;lt;/ref&amp;gt; und für [[Pfadweite]] kleiner oder gleich 6.&amp;lt;ref&amp;gt;[https://arxiv.org/abs/1705.07066 Elke Fuchs, Laura Gellert, Irene Heinrich: Cycle decompositions of pathwidth-6 graphs], Arxiv 2017&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Anwendungsbeispiele ==&lt;br /&gt;
=== Das Königsberger Brückenproblem ===&lt;br /&gt;
Das [[Königsberger Brückenproblem]] lässt sich in folgendem Graphen ausdrücken:&lt;br /&gt;
[[Datei:Königsberg Bridges graph.svg|links|mini|Graph für das Königsberger Brückenproblem]]&lt;br /&gt;
Die Kreise ([[Knoten (Graphentheorie)|Knoten]]) sind die jeweiligen Stadtteile bzw. Standpunkte. Die Linien ([[Kante (Graphentheorie)|Kanten]]) sind die Brücken. Durch Probieren wird herausgefunden, dass es nicht möglich ist, einen Rundgang durch die Stadt zu finden, bei dem jede Brücke genau ein einziges Mal benutzt wird. Es gibt also keinen Eulerweg und demzufolge auch keinen Eulerkreis. Warum ist das so?&lt;br /&gt;
&lt;br /&gt;
Euler hat die folgende Gesetzmäßigkeit entdeckt: Wenn in einem Graphen &amp;#039;&amp;#039;G&amp;#039;&amp;#039; ein Eulerweg existiert, dann haben maximal 2 Knoten ungeraden Grad. Beim Königsberger Brückengraphen gibt es vier Knoten mit ungeradem Grad. Die Zahlen neben den Knoten geben in der Abbildung deren Grad an. Deshalb ist der Stadtrundgang mit dem nur einmaligen Benutzen jeder Brücke unmöglich.&lt;br /&gt;
&lt;br /&gt;
Ein ungerader Knoten ist entweder Anfang oder Ende des Weges über die Brücken: null ungerade Knoten würde bedeuten, dass Anfang und Ende des Weges in Königsberg identisch sind. Ein Weg mit Anfang und Ende hätte maximal zwei ungerade Knoten. Ergo ist es in Königsberg nicht möglich gewesen, alle Brücken in einem &amp;#039;&amp;#039;Wege&amp;#039;&amp;#039; nur jeweils einmal zu begehen.&lt;br /&gt;
&lt;br /&gt;
=== Das Haus vom Nikolaus ===&lt;br /&gt;
{{Hauptartikel|Haus vom Nikolaus}}&lt;br /&gt;
Das beliebte Kinderrätsel „Das ist das Haus vom Nikolaus“ hingegen enthält einen Eulerweg, aber keinen Eulerkreis, da sein Graph zwei Knoten vom Grad 3 enthält.&lt;br /&gt;
&lt;br /&gt;
[[Datei:HausVomNikolaus.png|Das ist das Haus vom Nikolaus]]&lt;br /&gt;
&lt;br /&gt;
Solch ein Eulerweg ist 1-2-4-3-1-4-5-3-2. Knoten 1 und 2 haben jeweils 3 Nachbarn, ihr Grad ist also &amp;#039;&amp;#039;ungerade&amp;#039;&amp;#039;. Um das Haus in einem Zug zeichnen zu können, muss daher an einem dieser beiden Punkte begonnen werden. Ein Quadrat mit Diagonalen enthält keinen Eulerweg, da alle seine Knoten den Grad 3 haben. Im Bild sind das nur die Punkte 1, 2, 3, 4 mit den verbindenden Kanten.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
{{Commonscat|Eulerian paths|Eulerkreisproblem}}&lt;br /&gt;
* [[Hamiltonkreisproblem]]&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
* Wladimir Velminski: &amp;#039;&amp;#039;Leonhard Euler. Die Geburt der Graphentheorie&amp;#039;&amp;#039;. Kulturverlag Kadmos, Berlin 2008, ISBN 978-3-86599-056-3.&lt;br /&gt;
* Reinhard Diestel: [https://www.math.uni-hamburg.de/home/diestel/books/graphentheorie/ &amp;#039;&amp;#039;Graphentheorie.&amp;#039;&amp;#039;] 3. Auflage. Springer, 2006, ISBN 3-540-21391-0, S. 23–24&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Problem (Graphentheorie)]]&lt;br /&gt;
[[Kategorie:Leonhard Euler als Namensgeber]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Legov20</name></author>
	</entry>
</feed>