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

Informatiker Board » Themengebiete » Praktische Informatik » Algorithmen » Zweifach zusammenhängend » Antwort erstellen » Hallo Gast [Anmelden|Registrieren]

Antwort erstellen
Benutzername: (du bist nicht eingeloggt!)
Thema:
Nachricht:

HTML ist nicht erlaubt
BBCode ist erlaubt
Smilies sind erlaubt
Bilder sind erlaubt

Smilies: 21 von 33
smileWinkDaumen hoch
verwirrtAugenzwinkerngeschockt
Mit ZungeGottunglücklich
Forum Kloppebösegroßes Grinsen
TanzentraurigProst
TeufelSpamWillkommen
LehrerLOL HammerZunge raus
Hilfe 
aktuellen Tag schließen
alle Tags schließen
fettgedruckter Textkursiver Textunterstrichener Text zentrierter Text Hyperlink einfügenE-Mail-Adresse einfügenBild einfügen Zitat einfügenListe erstellen CODE einfügenPHP CODE farbig hervorheben
Spamschutz:
Text aus Bild eingeben
Spamschutz

Die letzten 10 Beiträge
Shizmo

Ich glaub es hat grade klick gemacht.

Zitat:
Original von eulerscheZahl
Grundüberlegung:
Bei der Tiefensuche entsteht ein Baum.
[...]


Bin grad nochmal alles durchgegangen und habe mir Tiefensuchbäume aufgezeichnet und somit ist alles viel klarer geworden.

Vielen Dank für deine Hilfe!!!!
eulerscheZahl

Grundüberlegung:
Bei der Tiefensuche entsteht ein Baum. Es kann auch keine Querverbindung zwischen den Ästen mit gleicher Wurzel geben.

Betrachten wir zwei Knoten u und v:
es gibt einen Weg von u nach v, der durch die Tiefensuche gefunden wurde. Wenn es aber keinen anderen Weg gibt, um von v aus wieder über u zu kommen, ist u ein Artikulationspunkt (der einzige Weg von Knoten oberhalb von u nach v führt eben über u).

lowlink gibt an, wie weit man maximal zurück nach oben kommt. Kommt man nicht höher als bis u, ist u ein Artikulationspunkt.


Sag Bescheid, wenn du meine Vorlesungsmitschrift willst. Da ist der Beweis ausführlicher.
Shizmo

Okay, aber warum macht man das? Generell, was ist dieses lowlink?
eulerscheZahl

Zitat:
Ich hab grad gemerkt, dass mir dieser Minimum-Vergleich fehlt, vermutlich klappt es deswegen nicht. Versteh aber auch nicht ganz für was der ist.

Es kann sein, dass ein Knoten mehrere Rückkanten hat. Dann sprichst du immer so weit zurück nach oben wie möglich.
Shizmo

Wird keiner gefunden gibt er aber auch ein false zurück und start.outDegree ist immer 1.

Ich hab grad gemerkt, dass mir dieser Minimum-Vergleich fehlt, vermutlich klappt es deswegen nicht. Versteh aber auch nicht ganz für was der ist.

Hab mal eine andere Version, die funktioniert soweit, allerdings nicht für einen trivialen Graph (also mit nur zwei Knoten).

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:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
time = 0
isBiconnected = true

for each v in V
   v.color = weiß
   v.PI = NIL

BICONNECTED(startNode)


return isBiconnected
--------------------------

BICONNECTED(u)

u.color = gray
u.d = time
u.l = u.d

time++

for each v in Adj[u]
   if v.color == white
      v.PI = u
      MDFS-visit(v)

      /* Kleineren Low-Wert des Kindes uebernehmen. */
      u.l = min{u.l, v.l}

      /* u ist Artikulationspunkt */
      if v.l > u.d
         isBiconnected = false
         return

   /* Rueckwaertskante */
   if v.color == gray and u.PI != v
      /* Merken, welche am weitesten zurueck reicht. */
      u.l = min{u.l, v.d}

u.color = black
eulerscheZahl

Kann es sein, dass ich einfach die Negation falsch gesetzt habe?

Mein Gedanke war: wenn findArtPoint true zurückgibt, hat der Graph einen Artikulationspunkt.
Jetzt gibt der Algorithmus aber false zurück, wenn ein Artikulationspunkt gefunden wird.
Shizmo

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.
eulerscheZahl

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).
Shizmo

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

eulerscheZahl

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.
Es sind weitere Beiträge zu diesem Thema vorhanden. Klicken Sie hier, um sich alle Beiträge anzusehen.