Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Praktische Informatik » Algorithmen » Zweifach zusammenhängend » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Seiten (2): [1] 2 nächste » Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Zweifach zusammenhängend
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Shizmo
Tripel-As


images/avatars/avatar-69.gif

Dabei seit: 16.10.2015
Beiträge: 174

Zweifach zusammenhängend Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Hallo, ich soll einen Algorithmus in Pseudocode angeben, der einen Graphen prüft, ob er zweifach zusammenhängend ist oder nicht.

Ich bin mir noch nicht ganz sicher, wie es am einfachsten ist, dies zu prüfen. Erst dachte ich mir es würde reichen, wenn ich prüfe, dass jeder Knoten mindestens 2 Ausgangskanten hat, aber das reicht nicht. Also irgendwie muss es immer ein Kreis sein. Hmm...
26.05.2016 22:31 Shizmo ist offline Beiträge von Shizmo suchen Nehmen Sie Shizmo in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Mit Tarjan findest du Artikulationspunkte und zweifache Zusammenhangskomponenten in Zeit O(|V|+|E|).

__________________
Syntax Highlighting fürs Board (Link)
26.05.2016 23:11 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Shizmo
Tripel-As


images/avatars/avatar-69.gif

Dabei seit: 16.10.2015
Beiträge: 174

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Danke für deine Antwort.

Die Laufzeit ist in dem Fall egal, ich werde den morgen mal durchgehen und versuchen zu verstehen.

Aber hast du vllt noch eine Idee, auf welche Eigenschaften ich noch überprüfen muss.
Wollte es eigtl auf der Basis von DFS oder so machen, falls das überhaupt möglich ist.

LG
26.05.2016 23:39 Shizmo ist offline Beiträge von Shizmo suchen Nehmen Sie Shizmo in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Tarjan basiert auf einer Tiefensuche.

Ein sehr primitiver Algorithmus, der auch prüft, ob ein Graph zweifach zusammenhängend ist:
code:
1:
2:
3:
4:
5:
Für jedes Knotenpaar s,t in G:
    finde einen Weg von s nach t
    G' = G ohne Knoten auf Weg zwischen s und t
    wenn s und t in G' nicht mehr verbunden sind, ist der Graph nicht zweifach zusammenhängend, also gib FALSCH zurück
gib WAHR zurück


__________________
Syntax Highlighting fürs Board (Link)

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von eulerscheZahl: 27.05.2016 21:06.

27.05.2016 21:05 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Shizmo
Tripel-As


images/avatars/avatar-69.gif

Dabei seit: 16.10.2015
Beiträge: 174

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Hallo, danke für deine Antwort, hab mir jetzt den Tarjan-Algorithmus etwas angeschaut und hab eine etwas abgespecktere Version entdeckt und diese noch etwas bearbeitet.

Mein Problem ist allerdings, dass der Startknoten nicht überprüft wird und immer wenn er bei diesem am Ende angelangt, false ausgibt. Ansonsten könnte es evtl funktionieren. großes Grinsen

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
//Initialisieren
for each n in G
   n.visited = false
   n.dfs = NIL
   n.lowlink = NIL
   n.PI = NIL

counter = 0

findArtPoint(start)


//Eigentliches Programm
findArtPoint(Vertex v)

   v.visited = true
   v.dfs = counter++
   v.lowlink = v.dfs

   for each w in Adj[v]
      if (! w.visited) {
         w.PI = v
         findArtPoint(w);
         if (w.lowlink >= v.dfs)
            return false

      else if (v.PI != w)
         v.lowlink = Minimum(v.lowlink, w.dfs)
28.05.2016 00:32 Shizmo ist offline Beiträge von Shizmo suchen Nehmen Sie Shizmo in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Wenn der Startknoten einen Grad > 1 hat, ist er Artikulationspunkt. Das liegt daran, dass die Teiläste untereinander nicht verbunden sind und deshalb jeder Weg von einem Ast zum anderen über den Startknoten laufen muss.

Du musst also nur noch den Grad des Startknotens prüfen.

__________________
Syntax Highlighting fürs Board (Link)
28.05.2016 06:13 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Shizmo
Tripel-As


images/avatars/avatar-69.gif

Dabei seit: 16.10.2015
Beiträge: 174

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Hey danke fuer deine Antwort, aber egal was hier der Startknoten wäre, jeder hat Grad > 1 , aber es gibt keinen Artikulationspunkt. verwirrt

28.05.2016 08:50 Shizmo ist offline Beiträge von Shizmo suchen Nehmen Sie Shizmo in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Du darfst nur die Vorwärtskanten zählen. Wenn die Wurzel mehr als eine nicht gestrichelte Kante hat, dann ist sie ein Artikulationspunkt.

eulerscheZahl hat dieses Bild (verkleinerte Version) angehängt:
graph.png



__________________
Syntax Highlighting fürs Board (Link)
28.05.2016 08:59 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Shizmo
Tripel-As


images/avatars/avatar-69.gif

Dabei seit: 16.10.2015
Beiträge: 174

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Egal ob ungerichtet oder gerichtet?
Ich hab vergessen dazu zu schreiben, dass es sich um ungerichtete Graphen handelt.
28.05.2016 09:25 Shizmo ist offline Beiträge von Shizmo suchen Nehmen Sie Shizmo in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Bei der Tiefensuche machst du daraus einen gerichteten Graphen.

Dass es um einen ungerichteten Graphen geht war klar. Sonst würde es starke Zusammenhangskomponente heißen, nicht zweifache.

Beim gerichteten Graphen kommen noch mehr Kantentypen hinzu: Crosskanten (zwischen den Zusammenhangskomponenten) und Vorwärtskanten, die über mehrere Knoten gehen.

__________________
Syntax Highlighting fürs Board (Link)

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von eulerscheZahl: 28.05.2016 09:30.

28.05.2016 09:28 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Shizmo
Tripel-As


images/avatars/avatar-69.gif

Dabei seit: 16.10.2015
Beiträge: 174

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Zitat:
Original von eulerscheZahl
[...]
Du musst also nur noch den Grad des Startknotens prüfen.


Hast du einen Vorschlag, wie ich das in den bisjetzigen Pseudocode implementieren könnte?
28.05.2016 13:58 Shizmo ist offline Beiträge von Shizmo suchen Nehmen Sie Shizmo in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

So zum Beispiel
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
//Initialisieren
for each n in G
   n.visited = false
   n.dfs = NIL
   n.lowlink = NIL
   n.PI = NIL
   n.outDegree = 0

counter = 0

bool biconnected = !findArtPoint(start) && start.outDegree == 1


//Eigentliches Programm
findArtPoint(Vertex v)

   v.visited = true
   v.dfs = counter++
   v.lowlink = v.dfs

   for each w in Adj[v]
      if (! w.visited) {
         w.PI = v
         n.outDegree++
         findArtPoint(w);
         if (w.lowlink >= v.dfs)
            return false

      else if (v.PI != w)
         v.lowlink = Minimum(v.lowlink, w.dfs)

edit: du solltest vielleicht auch noch irgendwann true zurückgeben.

__________________
Syntax Highlighting fürs Board (Link)

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von eulerscheZahl: 28.05.2016 14:07.

28.05.2016 14:04 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Shizmo
Tripel-As


images/avatars/avatar-69.gif

Dabei seit: 16.10.2015
Beiträge: 174

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Hmm, also Zeile 24 soll v.outDegree++ heißen oder?

Wenn ich aber so einen Graph habe (Anhang) wird false returned und der StartKnoten hat zu dem Zeitpunkt auch den outDegree-Wert = 1, also true, was aber nicht stimmt. (Der linke Knoten ist der Startknoten)

Shizmo hat dieses Bild (verkleinerte Version) angehängt:
1.jpg

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Shizmo: 28.05.2016 14:32.

28.05.2016 14:31 Shizmo ist offline Beiträge von Shizmo suchen Nehmen Sie Shizmo in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Ja, das hätte ein v werden sollen.
Wo ist denn das Problem bei deinem Graphen (tut mir leid, ich bin gerade denkfaul nach 2.5h Programmierwettbewerb).

__________________
Syntax Highlighting fürs Board (Link)
28.05.2016 18:37 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Shizmo
Tripel-As


images/avatars/avatar-69.gif

Dabei seit: 16.10.2015
Beiträge: 174

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Hja, das glaub ich dir geschockt

Linker Knoten = A, mittlerer B und rechter Knoten = C.

A.visited = true
A.dfs = 1
A.lowlink = 1

B.Pi = A
A.outDegree = 1

B.visited = true
B.dfs = 2
B.lowlink = 2

C.Pi = B
B.outDegree = 1

C.visited = true
C.dfs = 3
C.lowlink = 3

if (C.lowlink >= B.dfs) (3>2) => return false

=> bool biconnected = true && start.outDegree == 1

Also true.
Aber der Graph ist nicht biconnected.

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Shizmo: 28.05.2016 19:01.

28.05.2016 18:45 Shizmo ist offline Beiträge von Shizmo suchen Nehmen Sie Shizmo in Ihre Freundesliste auf
Seiten (2): [1] 2 nächste » Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Praktische Informatik » Algorithmen » Zweifach zusammenhängend