So prüfen Sie, ob ein ungerichteter Graph einen ungeraden Längenzyklus hat

8

Ich versuche, einen O (| V | + | E |) Zeitalgorithmus zu finden, um zu prüfen, ob eine Verbindung besteht ungerichteter Graph hat einen Zyklus von ungerader Länge oder nicht.

Ich überlege, eine Breite zuerst Suche auf dem Graphen zu machen und zu versuchen, die Scheitelpunkte schwarz und weiß zu beschriften, so dass keine zwei Scheitelpunkte, die mit der gleichen Farbe markiert sind, benachbart sind.

Gibt es einen bekannteren Algorithmus, um dieses Problem in linearer Zeit zu lösen?

    
user1048858 16.11.2011, 04:11
quelle

3 Antworten

9

Ihr Ansatz ist der richtige. Du kannst nicht besser als das.

Der Grund dafür ist, dass wenn Sie die Vertices während der BFS mit ihrer Tiefe beschriften, alle Kanten entweder dieselben Labels oder Labels verbinden, die sich um eins unterscheiden. Es ist klar, dass, wenn es eine Kante gibt, die die gleichen Etiketten verbindet, es einen ungeraden Zyklus gibt. Wenn nicht, können wir alle ungeraden Etiketten weiß und alle geraden Etiketten schwarz färben.

    
Petar Ivanov 16.11.2011, 05:11
quelle
0

Es kann auch mit DFS und Nummerierung der Vertices gemacht werden.

  1. Uhr = 1
  2. Beginne mit einem Eckpunkt 's', markiere ihn als "besucht" und rufe Explore (s)
  3. auf

Erkunden Sie (u)

  1. Wenn Sie bereits "besucht" haben, dann wenn (Takt-Num [u]) ungerade ist, dann gibt es einen ungeraden Zyklus,

    sonst markieren Sie "u" als "besucht"

  2. Num [u] = Uhr ++;

  3. für alle benachbarten Knoten v von u

    %Vor%
Mostafizar 17.02.2017 22:35
quelle
0

Bei der Initialisierung müssen Sie auch Num [s] = 0 setzen.

    
KeithB 17.03.2017 12:23
quelle

Tags und Links