Brücken in einem verbundenen Graphen

7

Ich habe eine Programmieraufgabe (keine Hausaufgaben), wo ich die Brücken in einem Graphen finden muss. Ich habe selbst ein wenig daran gearbeitet, konnte mir aber nichts Befriedigendes einfallen lassen. Also habe ich es gegoogelt, ich habe etwas gefunden, aber ich kann den Algorithmus nicht verstehen, wie er dargestellt wird. Könnte jemand bitte diesen Code ansehen und mir eine Erklärung geben? "

%Vor%     
frodo 27.06.2012, 02:50
quelle

3 Antworten

27

Def: Bridge ist eine Kante, die beim Entfernen den Graphen trennt (oder die Anzahl der verbundenen Komponenten um 1 erhöht).

Eine Beobachtung bezüglich Brücken im Graphen; Keine der Kanten, die zu einer Schleife gehören, kann eine Brücke sein. In einem Diagramm wie A--B--C--A wird das Entfernen der Kanten A--B , B--C und C--A die Grafik nicht trennen. Bei einem ungerichteten Graph bedeutet die Kante A--B jedoch B--A ; und diese Kante könnte immer noch eine Brücke sein, wobei die einzige Schleife, in der sie sich befindet, A--B--A ist. Wir sollten also nur die Schleifen betrachten, die von einer hinteren Kante gebildet werden. Hier hilft die übergeordnete Information, die Sie im Funktionsargument übergeben haben. Es wird Ihnen helfen, die Schleifen wie A--B--A nicht zu verwenden.

Um nun die hintere Kante (oder die Schleife) A--B--C--A zu identifizieren, verwenden wir die Arrays low und pre . Das Array pre ist wie das visited Array im dfs-Algorithmus; aber anstatt nur den Scheitelpunkt als besucht zu kennzeichnen, identifizieren wir jeden Scheitelpunkt mit einer anderen Nummer (entsprechend seiner Position im dfs-Baum). Das low -Array hilft dabei, festzustellen, ob eine Schleife vorhanden ist. Das low -Array identifiziert den Knoten mit der niedrigsten Nummer (ab pre -Array), den der aktuelle Scheitelpunkt erreichen kann.

Läßt uns durch dieses Diagramm A--B--C--D--B arbeiten.

Beginnend bei A

%Vor%

An diesem Punkt haben Sie einen Zyklus / eine Schleife in der Grafik gefunden. In deinem Code wird if (pre[w] == -1) dieses Mal falsch sein. Sie betreten also den else-Teil. Die if-Anweisung überprüft, ob B der übergeordnete Scheitelpunkt von D ist. Dies ist nicht der Fall, also D wird B s pre -Wert in low aufnehmen. Fahren Sie mit dem Beispiel fort,

%Vor%

Dieser low -Wert von D wird über den Code C an low[v] = Math.min(low[v], low[w]); weitergegeben.

%Vor%

Nun, da der Zyklus / die Schleife identifiziert ist, stellen wir fest, dass der Vertex A nicht Teil der Schleife ist. Also drucken Sie A--B als Brücke aus. Der Code low['B'] == pre['B'] bedeutet, dass eine Kante zu B eine Brücke ist. Dies liegt daran, dass der kleinste Vertex, den wir von B erreichen können, B selbst ist.

Ich hoffe, diese Erklärung hilft.

    
deebee 27.06.2012, 07:38
quelle
1

Keine neue Antwort, aber ich brauchte das in Python. Hier ist eine Übersetzung des Algorithmus für ein ungerichtetes NetworkX Graph Objekt G :

%Vor%

Seien Sie vorsichtig mit Pythons Rekursionstiefe Limiter für große Graphen ...

    
gerowam 08.02.2017 18:10
quelle
1

Keine neue Antwort, aber ich brauchte das für die JVM / Kotlin. Hier ist eine Übersetzung, die sich auf com.google.common.graph.Graph stützt.

%Vor%

Hoffentlich erleichtert dies jemandem das Leben.

    
Jonathan Leitschuh 05.02.2018 23:10
quelle

Tags und Links