Bei einem ungerichteten, ungewichteten, verbundenen und möglicherweise parallelen Graphen kann eine Euler-Schaltung konstruiert werden, wenn jeder Scheitelpunkt in einen geraden Grad hat.
In Graphen mit zwei oder mehr Scheitelpunkten ungeraden Grades (es kann nur ein Vielfaches von zwei geben) muss der Graph "Eulerisiert" werden, wobei die ungeraden Scheitelpunkte bei Bedarf mit zusätzlichen Kanten durch andere Scheitelpunkte verbunden werden.
Der optimale Fall für die Eulerisierung ist die Konstruktion von nur Kanten, wobei die Anzahl der Scheitelpunkte ungeraden Grades ist. Dies kann jedoch nur dann der Fall sein, wenn jeder ungerade Scheitelpunkt einen benachbarten Partner hat, sodass wir beide Scheitelpunkte mit verbinden können eine Kante und beide gleichmäßig machen.
Davon abgesehen benötigen die meisten Diagramme mehr als Kanten. Als Menschen tendieren wir dazu, Graphen zu eulerisieren, indem wir immer jedes Paar ungerader Eckpunkte auswählen, die nebeneinander liegen, und dann für den Rest Versuch und Irrtum verwenden. Dies funktioniert jedoch nicht immer.
Wenn Sie im folgenden Diagramm beispielsweise eine Kante zwischen dem Paar benachbarter ungerader Eckpunkte hinzufügen und Kanten verwenden, um zu verbinden, wird eine Eulerisierung durchgeführt, die Kanten kostet . Wenn Sie jedoch stattdessen und eine Eulerisierung, die Kanten kostet , obwohl die benachbarten ungeraden Scheitelpunkte nicht zu ihrem Vorteil verwendet wurden.
Ich weiß mit Sicherheit, dass dieses Problem zumindest durch rohe Gewalt lösbar ist, da die Anzahl der Paare ungerader Eckpunkte, die mit einer bestimmten Anzahl von Kanten verbunden werden sollten, endlich ist. Insbesondere gibt es ( Mathematica sagte dies ) mögliche Sätze von Paaren ungerader Eckpunkte, die verbunden werden können. Es ist möglich, jeden einzelnen zu durchlaufen und jeden Scheitelpunkt mit seinem Partner zu verknüpfen (das Finden des kürzesten Pfades zwischen den beiden Scheitelpunkten in einem ungerichteten Diagramm ist wahrscheinlich eine Herausforderung für sich, für die Wikipedia keine zeitliche Komplexität angibt ).
Am Ende läuft der ganze Deal wahrscheinlich in Polynomzeiten Exponentialzeiten Fakultätszeit, was ziemlich böse ist. Ich habe einige grundlegende Untersuchungen durchgeführt, ob es Algorithmen gibt, die Pfade Eulerisieren, aber keine zu finden scheinen.
Mathematica- Code für Grafik:
GraphPlot[
{1 -> 2, 2 -> 5, 5 -> 3, 3 -> 6, 6 -> 3, 6 -> 7, 7 -> 6, 2 -> 7, 7 -> 8, 8 -> 9, 9 -> 10, 10 -> 4, 4 -> 11, 11 -> 4, 11 -> 12, 12 -> 1, 1 -> 12},
VertexRenderingFunction ->
(If[#2 < 5,
Text[Style[#2, Large], #1, Background -> Yellow], Null] &)]