So. Okay. Das kannst du erzählen. Okay. Graphen
Teil Teil 2, glaube ich. Letztes Mal war,
glaube ich, die erste Graphenvorlesung. Heute Teil 2. Vorher
einmal die Frage, gibt es Probleme mit den Next-to-Go-Videos?
Bei euch? Der ein oder andere von euch guckt ihr
ja bestimmt trotzdem an, auch wenn er hier ist,
oder? Also wehrt sich schon mit Elector-to-Go-Videos angeguckt?
Wer hat das schon mal reingeguckt? Gab es da irgendwo
Probleme so? Oder lief das alles
Ich meine, es ist auch so richtige Probleme,
so was wie irgendwie lässt sich nicht abspielen oder so, so was.
Bitte? Der Leistung ging neulich nicht, sagt er.
Aber das war nicht das, was euch berichtet wurde,
ne? Seit zwei Wochen lang ein Player. Bei dir
funktioniert das auch nicht. Ja, damit was?
Wir haben seit zwei Wochen bei der Stephen Goal-Night Player,
das funktioniert nicht mehr mit dem Explorer.
Ich muss das jetzt mal erst laufen. Er sagt gerade,
Lector to Go hat einen neuen Player seit zwei Wochen
und seitdem läuft es nicht mehr mit.
Eigentlich allem. Aber entweder das könnte auch in der Browserversion
liegen,
Ja, ich habe noch was Besseres.
Okay, bei dir läuft es, bei dir nicht?
Okay, ein etwas verwirrendes Bild. Einige Leute sagen,
gar nichts läuft, einige Leute sagen, alles läuft.
Edge funktioniert, sagt er. Ja. Ja,
als Kim mich gestern gefragt hat,
dachte ich, naja, wenn es Probleme gegeben hätte,
hätte ich ja bestimmt schon eine Flut von E-Mails gekriegt.
Die ist ausgeblieben, aber so dachte ich, das muss
wohl laufen. Aber gut, wenn du jetzt sagst,
es läuft nur noch mit einem
Okay. Ja, aber ich glaube, auch wenn da
100 E-Mails aufgelaufen werden mit A und D, funktioniert nicht mehr,
die hätten vielleicht auch schon mal eine Menge Bescheid gesagt.
Mit was? Bei der Snowboard von einer Vorlesung da.
Aiko, ja. Das war eine Glossbahn ermittelt,
das war schnell. Ja, aber eigentlich ist das,
also Acture to Go ist ja eigentlich relativ,
ich weiß ein Video, das ein paar außerläuft,
was soll da eigentlich klappen?
Mal gucken, die kriegen das schon gefixt so
Ja, Vorlesung heute. Wir haben ja
letztes Mal Breitensuche und Tiefensuche gemacht. Mit dem ersten Ziel
quasi ein bisschen was über die Struktur vom Grafen rauszukriegen.
Also dass man so einen Spannbaum hat. Und da machen
wir heute auch weiter. Jetzt sagen wir jetzt,
kriegen die Kanten Gewichte. Und dann wollen wir weiterhin Spannbaum
bestimmen, aber bitte einen mit minimalem Gewicht.
Also wenn die Kanten irgendwie Gewichte haben, wir bestimmen Spannbaum,
dann addieren wir die Kantengewichte auf und die Zahl,
die da rauskommt, die soll irgendwie möglichst gering sein.
Das ist irgendwie für relativ viele Anwendungen auch so fürs Pre-Processing ganz praktisch,
dass man dann irgendwie weiß, okay,
das ist irgendwie günstig und ich kann
alle Knoten da irgendwie mit erfassen
Dafür brauchen wir so minimale Spannbäume.
Und die leiten nachher über zu kürzesten Faden so,
dass man irgendwie schnell von Staat zu Ziel kommt.
Da kann man quasi so die eine Idee bei dem minimalen Spannbaum
so ein bisschen tweapen. Und dann ist man bei Deixtras
Algorithmus. Eingabe und gesucht, wir kriegen ungerichteten Grafen.
Spannbäume machen wir jetzt erstmal bei ungerichteten Grafen. Kann man
auch bei gerichteten irgendwie machen, aber da wird es so
ein bisschen mit den Definitionen so ein bisschen trickyer.
Deswegen machen wir das mit Ungerichteten.
Wir haben Grafen und wir haben halt so eine Gewichtsfunktion.
Und hier steht R Plus für alles, was wir machen
, brauchen wir eigentlich nur N.
Dass man irgendwie jede Kante hat,
irgendwie eine ganze Zahl als Gewicht und gut ist
Und gesucht ist eben so ein Spannbaum-Tee,
wobei ein Spannbaum hier unten steht es nochmal,
eben ein Teilgraf von G ist, der adzyklisch ist und alle Knoten enthalten soll.
A-Zyklisch schon zusammenhängt, sprich es ist ein Baum und er soll
alle Knoten von G enthalten. Dann hat er halt,
wenn der Graf G entknoten hat, dann hat er endminus eins Kanten,
also das ist auch die beste Möglichkeit quasi,
alle Knoten irgendwie mit Bekannten zu verbinden.
Genau. Und das hier, dieses W von Tee,
das wollen wir gerne minimieren,
da summieren wir quasi hier über alle Kanten auf,
die in dem Baum sind und die Zahl soll dann eben möglichst gering werden.
Nennt sich dann minimaler Spannbaum oder hier aus dem Englischen Minimal
Spanning Tree,
Das wollen wir machen. Da so ein Beispiel,
da kann man auch irgendwie gleich sehen,
dass das jetzt noch gar nicht so kompliziert,
aber man sieht halt nicht unbedingt auf den ersten Blick,
was jetzt irgendwie der minimale Spannbaum wäre.
Genau, und dafür wollen wir jetzt Algorithmen entwickeln.
Und jetzt gibt es einen, das ist der sogenannte Algorithmus von Kruskal,
der kommt jetzt als erstes, wer kennt ihn?
Algorithmus von Kruskal. Erzähl mal, wie geht der?
Kannst du erzählen, wie der geht?
Genau. Ich nehme immer die günstigste Kante,
die noch nicht gewählt wurde so
Dann nehme ich die in meinen Spannbaum auf, es sei denn,
dadurch würde ein Kreis entstehen. Also so das,
was man irgendwie intuitiv als quasi naiveste Brutforce-Idee so machen würde,
dass man sagt, naja, soll möglichst günstig sein,
also nehme ich nur die günstigen Kanten,
es sei denn, da würde ein Kreis entstehen,
weil dann wird es ja kein Baum mehr.
So, das ist irgendwie von der Idee her sagt man,
ja. Spannende dabei ist, Idee ist total schnell erzählt,
auf dem Blatt Papier lässt sich das auch total schnell ausführen.
Also wenn man den da hat, sieht das so aus,
die roten Linien jetzt. Warum? Naja,
man fängt irgendwie an, guckt sich die Kantengewichte an,
hier ganz unten zwischen F und H mit der Eins,
das ist halt das Geringste,
also nimmt man die dazu
Dann habe ich hier irgendwie zwei zwischen G und I und B und C
mit einer 2, nehme ich die beiden dazu.
Dann kommt hier die 3, nehme ich die dazu.
Jetzt kommt das erste Mal dieser Fall, dass ich jetzt
eigentlich als nächstes günstigstes diese Kante zwischen C und D hätte mit der 4.
Da stelle ich fest, naja gut, das führt jetzt
im Kreis zwischen den anderen beiden schon gewählten Kanten.
Also nehme ich die nicht. Eine andere 4 habe ich,
glaube ich, nicht. Dann habe ich hier diese 2-5er,
nehme die beiden rein, also zwischen G und H und I
und K. Und dann mache ich so weiter.
Dann stelle ich bei der Sechserkante zwischen F und G
fest, würde wieder ein Kreis entstehen.
Also nehme ich die nicht rein und so weiter.
Und dann höre ich entweder auf,
wenn ich alle Kanten durchgegangen bin oder wenn ich N-minus 1 Kanten habe,
weiß ich auch,
ich bin fertig
Also sprich hier zu dieser 14er-Kante werde ich nie kommen,
weil ich vorher schon weiß, ich habe N-minus 1 Kanten gewählt und ich muss fertig sein,
zumindest wenn der Graf dann zusammenhängt, ist.
Und dann ist gut. Das Problem dabei ist,
also wie gesagt, das ist irgendwie die Idee,
schnell erklärt, die Idee ist auch klar,
auf dem Blatt Papier lässt sich das super leicht ausführen.
Der Korrektheitsbeweis ist erstaunlich tricky. Da wird uns jetzt
auch gleich so die nächsten 40 Folien oder so begleiten.
Der Korrektheitsbeweis ist sehr schwierig und die Implementation ist dann auch ziemlich schwierig,
weil man, also zumindest wenn man sie schnell machen will,
wenn ich jetzt irgendwie sage, ist es mir egal,
wie lange das dauert, dann, was weiß ich,
dann sortiere ich einmal die Kanten und danach,
immer wenn ich eine wähle, gehe ich über alles nochmal rüber und gucke,
ob das drin ist oder so.
Und dann habe ich so eine, quasi so ein Brut-Forst-Ding so,
dann geht das natürlich geht, aber ist langsam,
wenn das irgendwie halbwegs effizient implementieren wollt,
braucht ihr irgendwie Möglichkeiten, um abzuprüfen,
wenn ich diese Kante zwischen C und D nehmen will,
darf ich das eigentlich machen?
Ist einer von den Knotenschuhen in meinem Baum drin oder nicht?
Und das ist relativ anspruchsvoll, das zu implementieren.
Da braucht man Datenstrukturen, für die wir noch gar nicht hatten.
Aber erstmal wollen wir mal gucken, dass die Idee irgendwie korrekt ist.
Also wenn wir erstmal schauen, Korrektheitsbeweis für diesen Algorithmus von Krusgal,
macht man einen Schritt zurück und macht das quasi erstmal ganz generisch und sagt,
das ist die generelle Idee, die wir so haben wollen.
Wir wollen sukzessive so eine Kantenmenge A aufbauen und das soll
quasi die Kantenmenge des Spannbaums sein
Und das wollen wir so machen, dass für diese Schleifen in Variante
hier, die soll die ganze Zeit immer erhalten bleiben.
Also bei jeder Iteration, in meinem Start, an der Iteration,
soll A, die Teilmenge eines minimalen Spannbaums sein.
Und dann ist die Idee in jedem Schritt,
also das gilt jetzt,
und im nächsten Schritt wähle ich jetzt eine Kante aus,
die hinzugefügt werden kann, ohne dass die in Variante verletzt wird.
Und dann nehme ich die hinzu.
Solche Kanten wollen wir jetzt hier jetzt sicher bezeichnen.
Also sichere Kanten sind quasi die guten Kanten, die,
die ich hinzunehmen kann, ohne dass die in Variante kaputt geht.
Da steht es auch nochmal genau,
E ist sicher für eine Teilmenge A eines minimalen Spannbaums,
für einen A-Vereinigt mit E
weiterhin Teilmenge eines minimalen Spannbaums ist
Und jetzt wird natürlich das Problem sein,
irgendwie diese Kanten zu bestimmen. Also wirklich zu wissen,
ist eine Kante sicher oder nicht und auch nachzuweisen mit der Idee von eben,
dass ich immer die mit dem geringsten Gewicht nehme,
bei der kein Kreis entsteht, dass das immer eine mit,
immer eine sichere Kante ist.
Das wird gleich das Problem sein. So sieht das dann im Source-Code
aus. Am Anfang haben wir nichts in der Kantenmenge und
dann gucken wir immer, ist da schon ein Spannbaum.
Das lässt sich relativ leicht prüfen, weil man immer guckt,
ob man irgendwie schon endminus eins Kanten hat.
Falls nicht, bestimme eine für a sichere Kante
UV und fügt die halt hinzu. Und da versteckt sich
halt die Arbeit, ne,
bestimme eine sichere Kante
Das ist nicht so einfach. Und dann kann man sich
mal überlegen, gilt jetzt tatsächlich hier die Schleifen in Variante?
Das ist relativ einfach, weil man das quasi durch
die Definition der sicheren Kante
geschenkt kriegt
In welcher denn? Nö. Er sagt gerade,
dass man in eine Sackgasse laufen könnte oder so.
Aber so richtig Sackgassen gibt es da ja nicht.
Ich laufe ja nicht irgendwie durch die Gegend,
so wie jetzt bei so einem Backtracking-Verfahren oder so,
wo ich irgendwo hingehe und dann wieder zurückgehen muss oder so.
Und ich habe halt diese ganze Kantenmenge und ich will immer
aus der Kantenmenge irgendwie Kanten raus.
Also so richtig eine Sackgasse könnte nicht entstehen. Also zumindest
nicht so, wie ich gerade den Begriff Sackgasse verstehe.
Also und wir gehen davon aus, dass der Graf zusammenhängt ist.
Sonst gibt es halt dieses Problem mit,
dass er dann halt kein Spannbau,
also dann hat er einen Spannwald oder so, keinen spannenden Baum.
Aber wenn er zusammenhängt ist,
dann muss es einen Spannbaum geben,
dann muss es auch einen minimalen Spannbaum geben
Und dann ist halt die Frage jetzt hier,
ob man den da bestimmen kann, mit diesem Verfahren.
Und wenn ihr euch überlegt,
so die sichere Kante ist ja gerade so definiert, dass gesagt wird,
wenn ich die hinzufüge, bleibt die Schleifen in Variante erhalten.
Jetzt kann man sich das da angucken, Initialisierung,
also wenn A 0 ist, naja, dann gilt auf jeden Fall,
dass A eine Teilmenge eines minimalen Spannbaums ist,
der minimale Spannbaum hat irgendwie so und so viele Kanten,
A ist leer, leere Mengen ist immer Teimenge.
Also Initialisierung gilt. Dann Fortsetzung, wenn das zu Beginn dieser Schleifeniteration
so ist, dass A Timemeng eines minimalen Spannbaums ist.
Und ich bestimme jetzt eine sichere Kante und füge die hinzu,
dann ist ja nach dieser Definition hier, Äh,
die hinzugefügt werden, ohne dass die in Variante verletzt wird.
Solche Kanten werden wir jetzt sicher bezeichnen. Also es sind gerade die Kanten,
die sicheren Kanten, für die das gerade gilt,
was ich haben will, das Gehirn zufügen kann,
ohne die in Variante zu verletzen.
Ergo gilt auch die Fortsetzung. Terminierung gilt auch, weil
irgendwann muss er einen Spannbaum bilden. Und jetzt noch die Frage,
gibt es immer eine sichere Kante? Naja, wenn A,
Teilmenge eines minimalen Spannbaums ist, aber noch kein Spannbaum ist,
dann muss es zumindest die Kante geben,
die in dem Baum jetzt irgendwie noch drin ist,
dass ich die hinzufügen kann.
Vielleicht gibt es auch noch irgendwie andere, aber zumindest die muss es geben.
Also es wird ja gesagt, A ist Teilmenge eines minimalen Spannenbaums.
Also gibt es in dem Spannbaum vielleicht noch weitere Kanten.
So, und davon kann ich mir halt eine nehmen.
Das muss eine sichere sein. Also weiß ich,
es gibt auf jeden Fall sichere Kanten, die fragen,
ob ich an die rankomme. Also ob ich das irgendwie
berechnen kann. Oder ob ich das schnell berechnen kann.
Also damit kann ich arbeiten. Das ist aber so ein bisschen quasi irgendwie,
dass man sagen würde, naja, natürlich gilt das,
wenn ich mir sichere, kannte, so definiere,
dass ich sage, eine sichere Kante erhält die schleifende Variante.
Folgt die Fortsetzung irgendwie daraus,
dass ich mir sicher so definiert habe,
weil das ist ein bisschen, aber wenn das alles ginge,
wenn ich jetzt also wirklich sage, alles klar,
hier ist ein Algorithmus,
um eine sichere Kante zu finden,
dann kann ich das
da reinbackschen hier
Ich bestimme eine für a sichere Kante und dann bin ich fertig.
So, was wir jetzt machen wollen,
gleich diese Regel mit der wir eine sichere Kante erkennen können.
Und das wollen wir dann einem beim Algorithmus von Kruska halt benutzen.
Einmal im Algorithmus von Prim, um effizient sichere Kanten zu bestimmen.
Das, was wir gleich haben als Satz,
ist eine recht generelle Aussage, welche Eigenschaften sichere Kanten haben.
Und dann können wir sagen, ah, okay,
die Idee von Kruska, die führt wirklich zu einer sicheren Kante.
Ein bisschen Definition hier, damit man einfacher darüber sprechen kann,
wenn wir so einen ungerichteten Grafen haben und wir partitionieren
die Knotenmenge V in zwei Timingen
Dann nennen wir das einen Schnitt. Von der Idee her
, warum Schnitt so? Weil von der Idee her,
ihr habt einen Graphen mit ganz vielen Knoten und jetzt macht
ihr in der Mitte einen Strich durch und dann habt ihr
einmal durchgeschnitten und oben habt ihr eine Menge von Knoten und habt eine Menge von Knoten.
Deswegen Partitionierung. Jetzt kann man den Schnitt natürlich nicht nur so machen,
sondern auch irgendwie so oder man kann hier ein Loch machen,
da ein Loch, aber so von der Idee her ist das halt ein Schnitt im Grasen.
Dann sagt man so eine Kante, kreuz den Schnitt,
wenn die Endpunkte der Kante, also U&V,
wenn die in verschiedenen Partitionen liegen.
Leicht nennen wir die Kante,
wenn sie eben den Schnitt kreuzt und unter all den Kanten,
die das tut,
das kleinste Gewicht hat
Und dann liebsten auch hier diese etwas anstrengende Definition,
ein Schnitt respektiert, eine Kantenmenge A,
falls keine Kante von A den Schnitt kreuzt.
Oder anders ausgedrückt, ein Schnitt respektiert eine Kantenmenge A,
falls für jede Kante gilt, sie liegt entweder in der
einen Menge hier von S- und V-S-U oder in der anderen.
Also keine Kante geht quasi über die Partitionierung rüber,
so dass sie in einem Teil in einem anderen beteiligt.
Bild dazu, die schwarzen Knoten hier oben sind die eine Knotenmenge,
die weißen hier unten sind die andere.
Dann illustriert hier dieser geschwungene Striche,
der illustriert quasi den Schnitt
All die Kanten, die den jetzt hier tatsächlich kreuzen.
Deswegen nennt man das auch kreuzen. Das sind halt
die Kanten, die das kreuzen. Und die mit dem
geringsten Gewicht ist hier die zwei zwischen B und C.
Das ist also die leichte Kante. Und der Schnitt respektiert auch
die Kantenmenge A, hier illustriert durch die roten Kanten.
Er respektiert die, weil keine der roten Kanten den Schnitt kreuzt.
Also jede von den roten Kanten hat als Endpunkte entweder zwei
weiße Knoten oder zwei schwarze Knoten.
Das sind so die ganzen Definitionen, die man da so braucht.
Und die Idee gleich ist halt,
dass man irgendwie sowas machen kann wie,
ich habe auf jeden Fall in jedem Punkt meines Algorithmuses,
habe ich so
eine Partitionierung
Irgendwie in die Knoten, die ich schon betrachtet habe,
die ich noch nicht betrachtet habe, irgendwie sowas.
Und dann weiß ich, ich habe da einen Schnitt drin
und dann weiß ich, da gibt es einen Minimaleck,
also eine leichte Kante, mit meinem Gewicht.
Und wenn ich die dazunehme, ist das okay.
Das ist so die Idee gleich. So, und das
kann man jetzt beweisen. Also ich habe so einen zusammenhängenden,
ungerichteten Grafen. Ich habe die Gewichtsfunktion und ich habe,
ich bin jetzt irgendwie schon fortgeschritten,
ich habe schon diese Teilmenge des minimalen Spannbaums.
A-Teilmenge von Art-Timinge von E, genau, also A,
eine Kantenmenge, Teilmenge eines minimalen Spannbaums.
Ich habe einen Schnitt, der soll A respektieren.
Und ich habe so eine leichte Kante UV, die eben den Schnitt kreuzt.
Und jetzt ist die Aussage, dann ist UV sicher.
Die ersten vier Zeilen sagen mir also, was ich alles benutzen darf,
die letzte Zeile sagt mir, wo ich hin will.
Ein guter Anfang ist erstmal das zu benennen hier,
diesen minimalen Spannbaum, nennen wir den mal Tee.
Dann habe ich diesen minimalen Spannbaum Tee
Tee ist minimaler Spannbaum, der A enthält, das wird
hier ja gesagt, A, Teilmenge eines minimalen Spannbaums.
Und wir wissen, UV ist ja eine leichte Kante.
Das heißt, die ist nicht in die, ach Quatsch,
Tees minimaler Spanbaum, der A und Head,
UV könnte in ET drin sein oder nicht.
Wenn UV aber in ET, wenn UV in ET drin ist,
dann ist klar, dass es sicher ist.
Weil wir wollen ja gerade erreichen, dass wir eine Kante
haben, die zu einem minimalen Spannbaum gehört.
Wenn die also in ET drin ist,
gehört sie zum minimalen Spannbaum, dann ist klar,
dass sie sicher ist
Alle anderen Voraussetzungen für sich sind erfüllt, so, alles super.
Also können wir davon ausgehen, dass sie nicht in dem,
diesem Teilbaum, in diesem Spannbaum-ET drin ist. Was wir jetzt machen wollen,
ist, wir wollen, ich habe das ausschneiden und einfügen genannt,
wir wollen quasi aus dem Spannbaum-Tee eine Kante rausnehmen,
die kannte UV einfügen, wenn die ihm eine Kante wegtun,
eine andere hinzu und sagen, oh,
jetzt haben wir wieder einen minimal entspannten Baum,
einen anderen, aber wir haben wieder einen.
Dann wissen wir, dass es sicher ist, UV hinzuzufügen.
Was dafür gewährleistet sein muss, ist,
dass die Kante, die wir ausschneiden,
nicht schon zu A gehört
Weil wir wollen ja A nicht groß, wir wollen ja zu A,
nur diese Kante UV hinzufügen und nicht noch was rausnehmen. Das heißt,
wir müssen irgendwie gucken, wenn wir das machen wollen,
wir wissen jetzt, es gibt so einen Spannbaum,
da liegen auch all die Dinger von A irgendwie drauf und jetzt wollen wir,
dass UV da nicht drauf liegt,
weil wenn das da drauf liegt, dann sind wir schon fertig,
wenn es da nicht drauf liegt,
dann wollen wir irgendeine andere Kante von dem Spannbaum nehmen,
ausschneiden und die Neue einfügen.
Bild dazu, so was wollen wir machen. Die vier
jetzt schon sichtbaren Zeilen beschreiben, dass die Idee ist quasi,
die schwarzen Knoten sind die eine Menge der Partition,
die weißen Knoten sind die andere Menge der Partitionen,
die dick eingezeichneten Kanten hier, das sind die die zu A gehören.
Alle Kanten, die man hier so sieht, also alle Kanten,
die durchgezogen gemalt sind, sind quasi die Tanten, die zur Tege hören.
Deswegen sieht man da auch, das ist ein Baum.
Die gestrichelte Kante hier, die gehört nicht zu Tee,
sondern die gehört zu G. Das ist jetzt quasi die Kante,
die wir betrachten wollen. Wir haben ja hier gesagt,
UV soll nicht zu dem Baum schon gehören.
Also das hier ist eine Kante, Punkt, Punkt,
Punkt, die nicht zu dem Baum gehört,
die wir jetzt aber hinzufügen wollen sozusagen.
Also wo wir dieses Ding mit ausschneiden und wieder einfügen machen wollen.
Und ansonsten kann G natürlich noch ganz viele weitere Kanten enthalten,
die sind jetzt alle nicht dargestellt
Genau, so. Und was wir wissen, nach Voraussetzungen,
das hier ist eine leichte, den Schnitt kreuzende Kante.
Also die kannte hier Kreuz den Schnitt, die ist leicht.
Vielleicht gibt es auch noch irgendwie eine Kante von dem
zweiten Knoten hier, den zweiten Schwarzen zu dem hier.
Die würde auch den Schnitt kreuzen, aber die ist jetzt
halt irgendwie nicht minimal. Deswegen ist die nicht hervorgehoben.
Und da gibt es vielleicht auch irgendwie noch andere Kanten.
Vielleicht gibt es ja eine Kante hier von dem zweiten Knoten,
wo ihr das Pedro runtersteht, zu X oder so.
Dann gibt es die Kante halt auch noch,
aber die gehört halt nicht zum Spannenbaum.
Also es gibt ja noch ganz viele andere Kanten,
die jetzt aber nicht relevant für uns sind.
Und was man jetzt, wenn man so dieses Bild sich zumalt,
was man jetzt sehen kann, ist,
es gibt ja scheinbar noch diese Kante XY hier
Die zwar zu dem Baum gehört, die aber nicht in A drin ist.
Und die Idee ist jetzt, die auszuschneiden und die andere einzufügen.
Dann habe ich wieder einen Baum. Man muss sich noch
zeigen, dass die auch wirklich minimal ist und so.
Aber dann wäre ich fertig. Tut mir herrlich live,
aber ich habe immer noch nicht gerade Eigenschaften mitbekommen von Entspannung,
was muss da alles können und was da alles sein?
Der Spannbaum. Die Frage war gerade, was der Spannbaum
alles können soll und nicht können soll und so.
Ein Spannbaum ist einfach ein Baum. Der enthält alle Knoten
deines eigentlichen Grafen. Ist zusammenhängend und enthält keine Kreise,
weil dann wäre es
kein Baum
So, das ist alles. Ja. Das ist nichts irgendwas,
weil ich habe mir die ganze Zeit jetzt mit etwas Kürzestes gut gemacht.
Ja, minimal. Also, du hast gerade
nach dem Spannborn gefragt, das wird der Spannbaum.
Minimal ist er dann noch unter allen Spannbäumen,
wenn er, wenn die Summe der Kantengewichte minimal ist.
Also möglichst klein. Ja, das war's. Sonst noch
Fragen. Jetzt müsstest du als nächstes sowas sagen und jetzt
möchte ich nochmal, dass wir bei Folie 3 nochmal anfangen.
Ganz von vorne
Okay, Idee, klar. Die Idee ist,
es gibt irgendwie einen minimalen Spannbaum da drin.
Den kenne ich aber quasi nicht. Ich weiß nur,
es gibt einen. Und jetzt habe ich schon einige der
Kanten, die in so einem minimalen Spannbaum drin sind.
Habe ich schon. Das sind hier die, die
dick schwarz hervorgehoben sind. Und jetzt ist die Aussage,
wenn es jetzt irgendwie so eine Kante UV gibt,
die den Schnitt kreuzt und leicht ist, leicht,
also sie kreuzt den Schnitt und ist unter denen,
die das tun, minimal,
dann kann ich die quasi zu dem Baum hinzufügen,
muss dafür eine andere wegnehmen.
Und dann habe ich wieder
einen minimalen Spannbaum
Und da steht jetzt die Kante XY liegt auf dem Pfad
PNT von U nach V und meine hält T-Strich eben,
indem man XY aus Tee entfernt und die Kante hinzufügt.
Warum muss es diese Kante hier geben? Weil den Knoten U
gibt es ja, den Knoten V gibt es ja.
Die müssen also entspannt, im Spannbaum irgendwie miteinander verbunden sein.
Ja? Ich hatte noch eine Frage. Ja. Die Kante XY,
die wir da ausschneiden, oder wir können doch nur Kanten nehmen,
die auch durch den Schließen gehen, oder?
Ja. Kommt auch gleich, warum es die geben muss.
So, jetzt ist es uns eigentlich nochmal eine Struktur
des Forums
Sein Baum hat ja eine Eigenschaft, und zwar nämlich,
dass ganz egal mit dem Strukturieren,
wenn wir eine ernsthaften Elemente haben,
haben wir auch eine feste Anzahl von Takten.
Weil die ist ja im Prinzip die Anzahl von Knoten,
wie du sagst. Ja. Ach so, die sind
nicht gewichtet. Ben. Mord in der Vorlesung.
Auf Video. Das ist auch eine gute Möglichkeit gewesen,
um mir quasi zu sagen, dir noch mal Folie 3 zurück.
Also ja, die sind gewichtet,
sonst kannst du einfach breit oder tiefensuche machen,
hast einen Spannbaum,
bist fertig
Aber wenn die jetzt alle ein Gewicht haben,
dann interessiert dich jetzt quasi die Summe dieser Kantengewichte und die wirst du möglichst minimal haben.
Als Beispiel, was weiß ich,
du willst Glasfaserkabel verlegen und du weißt zwischen allen Punkten,
die du irgendwie so als Notes hast,
wie teuer das ist und jetzt willst du, dass das Netz möglichst günstig ist.
Selbst da bist du dann, wenn man das sieht,
so der Durchschnittsbeweg zwischen einzelnen Punkten in meinem Netz und der Gesamtbeweg meines Netzes sind jetzt zwei unterschiedliche Sachen,
weil sagen wir es so, ganz egal,
für diese Partner untereinander verknüpft sind,
sie werden ja alle noch gleich einkern,
wenn es die gleichen Partner sind
Aber wenn ich jetzt zum Beispiel ein Ludwigskürzesten Weg
immer so in einem generellen Fall oder mein Netzwerker möchte,
also das... Moment, Moment, dann willst du etwas anderes.
Wenn du sagst, ich will einen möglichst kürzesten Weg für
jeweils zwei ausgewählte Punkte oder so, dann suchst du ja,
dann versuchst du nicht, den Spannbaum zu minimieren.
Also ein Gerüst zu haben, das möglichst günstig ist,
weil es was weiß ich, günstiger ist,
Glasfaserkabel über Land zu verlegen als durch Wasser.
Sondern was du dann versuchst, ist,
dass du sagst, jetzt möchte ich, dass,
keine Ahnung, der Datendurchsatz möglichst günstiger möglichst schnell geht,
egal ob ich irgendwie von da nach da oder von da
nach da will oder sowas.
Aber das ist eine andere Aufgabe
Und das macht der minimale Spann, warum dann tatsächlich auch nicht.
Also der minimale Spannbaum gibt uns ein Gerüst, das möglichst günstig ist.
Es bedeutet aber nicht, dass für je zwei auf
diesem Spannbaum jetzt verbundene Knoten der Pfad möglichst günstig ist.
Warte. Ja, kann man relativ... Nein, nein, hier. Genau,
wenn du Dreieck hast mit Kantengewichten 2, 3,
4, dann ist der minimale Spannbaum 2 und 3,
aber der Weg von da nach da über die Kante 4 wird günstiger als über 2 und 3 zu gehen.
Also das einfachste Beispiel, was mir gerade so einfällt,
wo man sehen kann, dass der Spannbaum dann zwar minimal ist,
wenn ich die Kante 2 und 3 nehme,
weil mit der 4er-Kante wird es immer teurer,
aber der kürzeste Weg von 1,
Mann am Klonen ist halt geringer dann
Und dass wir dann nicht durch den Spannbau abgedeckt.
Klar. Weil das jetzt hier auf jeden Fall von ein,
viel anderen Platten,
wenn wir es von allen anderen Platten aus sehen würden,
würde der weniger länger werden, weil bei mir jetzt den Baum nimmt.
Ja, trotzdem, es ging ja doch gerade nur um den kürzsten Weg.
Und der Weg wäre jetzt gerade nicht abgedeckt. Jetzt habe ich
das richtig verstanden bei den Schrittesmodi und überhaupt nichts gesagt.
Das heißt, für jeden Schnitt erst gibt es eine
zu viel Bekanntheit
Da wird nur gesagt, irgendwie, es gibt diesen Schnitt und der muss halt A respektieren.
Also so ein, zwei Einschaffen musst du haben,
du musst irgendwie A respektieren und dann muss noch diese leichte Kante geben und dann kann ich das machen. Also hier,
man sieht, also das ist eine Eigenschaft,
die er haben muss, im USA respektieren und diese Kante UV,
die müsste auch existieren, die würde dann zum Beispiel nicht existieren,
wenn es leer ist, dann habe ich das so partitioniert,
dass die eine Menge komplett leer ist und die andere alle Knoten enthält,
dann würde ich wahrscheinlich sagen, oh,
jetzt bin ich fertig so, bei dem Algorithmus,
den wir gleich ausführen wollen, aber das sind so die zwei Eigenschaften,
die du da irgendwie haben musst
So. Wissen wir eigentlich alle noch, wo wir hinwollen?
Also, wir haben diese Teilmenge des minimalen Spannbaums.
Wir haben den Schnitt, der Schnitt respektiert,
die Kantmenge A und wir haben eine leichte Kante.
Und dann ist die Aussage, dann ist UV sicher, das wollen wir zeigen.
Sprich, wir können die hinzufügen zu A und das,
was dann rauskommt, ist immer noch Teilmenge eines minimalen Spannbaums.
Und dann wurde gesagt, naja,
wenn UV schon in ET drin ist,
dann ist klar, dass ich die hinzufügen kann,
weil T ist ja schon minimaler Spannbaum.
Und wenn die jetzt aber nicht drin ist,
dann muss ich irgendwie mit ausschneiden und einfügen arbeiten
So, und dann ist hier,
man kann schon relativ viel aus dem Bild irgendwie rauslesen.
Diese Kante, dass es die geben muss, ist klar,
ist nach Voraussetzung. Die eine Frage ist, jetzt muss es
diesen Weg P geben und muss es diese Kante geben.
Und jetzt kann man sich überlegen, naja, wenn ich
einen Spannbaum habe, Tee, der verbindet ja alle Knoten miteinander.
Vielleicht zwar nicht mit dem kürzesten Weg, aber jetzt erstmal nur,
wenn es ums Verbinden geht, der verbindet alle Knoten miteinander.
Also muss es einen Weg von U2V geben in diesem Spannbaum.
Das ist ja auch nicht gerichtet oder so,
und dann sprich, ich kann,
wenn man sich das wirklich als Baum vorstellt mit Wurzeln,
dann kann es eben sein,
dass sie einmal hoch zu Wurzeln gehen und wieder runter auf der anderen Seite oder so,
aber das ist ja egal.
Aber es muss so einen Weg geben von U zu V. Und jetzt wissen wir ja,
dass U und V in unterschiedlichen Partitionen liegen,
sprich der eine Knoten ist schwarz, der andere ist weiß.
Dann heißt es aber, es muss diese Kante XY irgendwie geben,
weil auf diesem Pfad P muss jetzt dieser Fall eintreten,
schwarzer Knoten, schwarzer Knoten, schwarzer Knoten,
schwarzer Knoten und irgendwann kommt weißer Knoten, weißer Knoten,
weißer Knoten oder sowas.
Das muss irgendwie passieren,
weil der hier ja weiß sein soll und der schwarz und
dann muss das irgendwo anders auf dem Pfad auch schon mal,
da muss switchen.
Da steht, das Ziel oben ist immer noch das Bild,
das hier wollen wir zeigen,
das A vereinigt mit UV-Teimmenge von einem neuen Spannbaum-Teestrich ist,
den wir jetzt noch gar nicht genau definiert haben und das T-Strich eben ein minimaler Spannbaum ist.
Jetzt wird zuerst gesagt, UV bildet halt mit diesem Pfad P,
ein Zyklus. Sieht man auch irgendwie an dem Bild,
es gibt diesem Pfad P im Baum,
wenn ich UV noch dazu nehme und UV ist nicht in dem Baum drin,
dann muss da ein Kreis entstehen.
Dann weiß ich UV-Kreuz diesen Schnitt und dann,
da ist jetzt die Begründung von eben,
dann muss es so eine Kante XY geben,
die den Schnitt ebenfalls kreuzt,
eben wegen dieser Abfolge von schwarzen und weißen Knoten
So. Also im Worst Case,
wenn ihr hier irgendwie nur ein Dreieck habt,
das wäre ja quasi die kürzeste Möglichkeit für P,
also P muss mindestens die Länge 3 haben,
wenn P die Länge 2 hat,
dann ist es gerade der Weg von U zu V.
Das wird nicht funktionieren so. Da sagen wir ja gerade
, die soll da nicht drauf liegen. Das heißt,
man muss mindestens einen dritten Knoten geben und dieser Knoten hier,
der wird dann entweder die Farbe schwarz oder weiß haben.
Und dann ist, je nachdem, ob der schwarz oder weiß ist,
ist es dann entweder, wenn der schwarz ist,
wäre diese Kante eben die, die wir jetzt suchen.
Und wenn der weiß, es ist diese Kante.
Aber es muss halt diese Kante XY geben.
Und die muss den Schnitt ebenfalls kreuzen,
weil deine Knoten eine schwarze,
anderes weiß man
So, jetzt wird behauptet, hier XY ist nicht in A. Warum?
Es wurde ja gesagt, A, respektiert den Schnitt.
Also für jede Kante gilt, dass beide Enden in einer
Hälfte dieser Partition sind quasi. Also beide kannten hier,
bei den dunklen Kanten hier sind beide Enden entweder schwarz oder weiß.
Hier ist es gerade anders, das eine Ende ist schwarz,
das andere ist weiß bei XY.
Also kann das nicht in A drin sein. Das heißt,
die rauszunehmen ist unkritisch, wenn ich die aus dem Baum
rausnehme,
ich ändere nichts an
So, jetzt ist Teen Baum. Das heißt,
wenn ich die Kante entferne, dann zerfällt er in zwei Komponenten.
Auch klar, ich habe einen Baum mit N-Minus 1 Kanten,
sobald ich da eine rausnehme, zerfällt der Baum in zwei Komponenten.
Kann nicht weiterhin ein Baum sein, weil er hat ja keine Kreise.
Sobald ich eine Kante rausnehme, gibt es von dazu da
keinen Pfad mehr. Wenn es da weiterhin einen gäbe,
dann wäre das ja mit der Kante ein Kreis.
Wohlgemerkt im Spannbaum, nicht in dem Grafen jetzt.
Nur den Baum jetzt betrachtet. Wenn ich aus dem Baum
eine Kante rausnehme, dann zerfällt er in zwei Komponenten.
Und wenn ich dann halt diese Kante wieder hinzufüge,
dann verbinde ich die gerade wieder miteinander.
Das heißt, ich habe wieder
einen Baum
Und das Ding, das nenne ich dann halt T-Strich,
also Tee ohne die Kante XY und mit der Kante UV,
das nenne ich T-Strich und ich behaupte,
das ist ein Baum, gut, das habe ich gerade gezeigt,
ich behaupte, ist ein minimaler Spannbaum.
Also, wir wollen immer noch, dass dabei das zeigen,
aber jetzt haben wir wenigstens schon mal T-Strich. Jetzt zeige ich zuerst,
dass das ein minimaler Spannbaum ist und danach,
dass dieses A-Verein mit UV tatsächlich eine Timing ist,
wobei wir das quasi eben schon dadurch gemacht haben,
dass wir gesagt haben,
XY ist ja weder in Tee drin,
noch bis nicht in A drin,
also kann ich
das rausnehmen
Aber wir wollen uns zeigen, dass es auch ein minimaler Spannbaum ist.
Naja, von der Idee her, die kannte hier Kreuz
den Schnitt zwischen UV und die kannte zwischen XY kreuzt auch den Schnitt.
Und nach Voraussetzung war UV ja eine leichte Kante, die den Schnitt kreuzt.
Also kann es irgendwie nicht teuer werden, teurer werden.
Die Leichten waren ja gerade die mit minimalem Gewicht.
Da steht es, XY und UV kreuzen beide den Schnitt.
UV ist aber eine leichte Kante, also gilt,
dass ihr Gewicht höchstens so groß ist wie das von XY, also wie UVs.
Kleiner gleich wie XY und damit folgt dann eben,
dass das Gewicht von Teestrich, das ist ja dadurch gegeben,
dass sie sagen, das Gewicht von Tee,
ohne das Gewicht von XY, die haben wir ja rausgenommen,
plus das Gewicht von UV,
die haben wir
ja dazugenommen
Und wenn jetzt irgendwie hier XY halt größer gleich UV ist,
dann ziehen wir also mehr ab, als wir hinzufügen.
Das heißt, das Ganze hier, das ist kleiner,
gleich WT. Und weil Tea aber ein minimaler Spannenbaum war,
gilt quasi dadurch, dass WT wieder kleiner, gleich WT-Strich ist.
Dann haben wir irgendwie hier WT-Strich, kleiner, gleich WT,
kleiner, gleich WT-Strich. Das heißt, die müssen alle
gleich sein. Also haben wir hier gezeigt, dass WT-Strich
das Gleiche ist wie Tee und beides sind dann minimale Spannenbäume.
Also es geht ja darum zu zeigen,
dass WT-Strich vom Gewicht her nicht größer ist als WT,
da ist beides minimale Spannenbäume,
so sollten sie das gleiche Gewicht haben.
Kommt auch tatsächlich raus
Damit haben wir gezeigt, T-Strich ist ein minimaler Spannbaum.
Und dann müssen wir noch zeigen, hier, dass die
erste Bedingung auch gilt. Und das ist aber relativ einfach.
A, war ja eine Teilmenge von dem ersten Spannbaum-Tee.
XY war nicht in A drin. Damit,
weil wir T-Striche einfach nur Tee haben und XY rausgenommen haben,
ist A, weiterhin eine Teilmenge davon.
Und weil wir für T-Strich ja UV hinzugenommen haben,
ist A vereinigt mit UV eben auch eine Timebühne davon.
Und dann sind wir fertig. Der ist schon relativ tricky
Ja. Weil wir den nicht hatten,
sondern wir wussten nur, dass es den gibt.
Also wir wissen quasi, dass A eine Timingmenge eines minimalen Spannbarrums ist.
Aber wir wissen nicht, von welchem. Und die Aussage von
dem Satz ist jetzt, du kannst eine sichere Kante hinzufügen.
Also du musst jetzt irgendwie noch einen Schnitt haben,
der diese, der die Kantenmenge A respektiert.
Und dann kannst du angucken, was sind jetzt sichere Kanten?
Und der Satz sagt jetzt,
dann kannst du eine von diesen sicheren Kanten nehmen
Und das ist wieder Time-Manga, eines minimalen Spann, warum es diese Kantenmenge.
Aber du hast quasi diesen Spannbaum-Tee noch nicht. Du weißt nur
, es gibt den. Du hast doch den Spannbaum-Testrich noch nicht,
sondern damit machst du jetzt quasi weiter im nächsten Schritt.
Und wenn ihr so an Kruskals Algorithmus denkt,
der ist ja recht eingängig, dass man irgendwie sagt,
ich nehme immer die günstigste Kante,
wenn ihr da schon irgendwie ein paar Kanten genommen habt,
also irgendwie eine Kante mit der Gewicht, eins hier unten,
eine Kante mit Gewichtsweide oben oder so,
dann bilden diese Kanten quasi die Menge A und die Knoten davon,
das ist eine dieser beiden Partitionsmengen.
Und die anderen Knoten willen die andere
Und dann habt ihr, dann habt ihr jetzt eine Partitionierung.
Ihr habt die Kantenmenge A. Und jetzt könnt ihr euch sichere Kanten raussuchen,
indem ihr jetzt einfach guckt, die anderen Kanten, wo schneiden die?
Und damit könnt ihr dann arbeiten. Ja, warum die
noch nicht haben, weil wir sind bei dem das Wechsel zu.
Da müssen sie aus dir raus. Nein, nein,
nein, nein. Im Beweis machst du das. Also
die Frage war gerade, wenn ich Tee gar nicht habe,
woher weiß ich denn dann, wie XY aussieht,
um das rausnehmen zu können und so.
Du hast Tee ja nicht. Wenn du Tee schon hättest,
bin ich fertig, genau das, was er meinte.
Wenn ich Tee schon habe, bin ich fertig.
So, die Aussage ist, zu dieser Kantenmenge A gehört
irgendein minimaler Spann beim Tee
Weil die Aussage ist ja von dieser Schleifwillen-Variante, A,
ist Teilmenge eines minimalen Spannbaus. So. Mehr wissen wir aber nicht.
Wir wissen nur A, Teilmenge eines minimalen Spannbaums. So,
und damit das einfacher ist, nennen wir das Ding jetzt T.
Aber T, haben wir nicht. Und dann kann ich zeigen, naja,
jetzt kann ich mir irgendwie eine sichere Kante nehmen und die zu A hinzufügen.
Und das, was rauskommt, ist weiterhin Teilmenge eines minimalen Spannenbaums.
Aber eben nicht zwingend von T. Was mir auch egal ist,
weil ich will ja am Ende nur minimalen Spannbaum haben.
Ich will nicht sowas spielen, wie irgendwie du denkst dir
im minimalen Spannbaum aus und ich gebe einen Algorithmus,
mit dem ich den berechnen kann.
Sondern ich sage nur irgendwie, wenn du mir einen Graf
gibst, dann kann ich minimalen Spannbaum berechnen
Und das funktioniert halt, indem ich weiß,
es gibt diesen minimalen spannenden Baum-Tee, so.
Und da kann ich eine Kante rausnehmen. Eine andere Hinzufügung
ist wieder ein minimaler Spannbaum. Und das Einzige,
was mir da hilft halt, ist, dass ich sagen kann,
okay, ich kann sichere Kanten nehmen und habe dann wieder minimal entspannbar.
Also das, was ich aus dem Satz rauslese,
ist nicht, wie ich Tee oder T-Strich jetzt irgendwie berechne.
Das kann ich nachher dann iterativ machen, sondern nur,
dass ich weiß, wenn ich so eine Kantenmenge habe und einen Schnitt,
der die Kantenmenge respektiert, dann kann ich mir eine sichere Kante,
ja, eine sichere Kante nehmen,
die hinzufügen zu A und habe weiterhin etwas,
was Teilmenge eines minimalen Spannbaums ist
Das ist die Aussage. Warte mal, kommt der Satz
hier gleich nochmal? Ja, das war der Satz,
den mir gezeigt hat. Genau, die Aussage da ist,
ich habe diese Teilmenge A und ich habe einen Schnitt,
der A respektiert und jetzt bestimme ich eine leichte Kante UV.
Und dann weiß ich, okay, die kann ich hinzunehmen
und alles ist gut, dass das weiterhin sicher ist.
Also es ist die Teilmenge A,
vereinigt mit UV dann wieder Teilmenge eines minimalen Spannbaums ist
Fragen? Nee, die ist gerade, die ist
gerade nicht Bestandteil von A. Ja? Wenn ich die,
also erstmal von der von der Idee her,
wenn ich jetzt XY rausnehmen würde und UV dazu tun würde
und UV wäre auch drin gewesen,
dann wächst diese Kantenmenge A,
Das wäre also doof, ne?
So, aber warum die da nicht drin sein muss?
Wo stand denn das? Wie das hier nicht irgendwo?
Egal. Warum die da nicht drin sein muss?
UV-Kreuzer den Schnitt nach Voraussetzung, ne? Und dann war die Aussage,
es muss irgendwie einen Pfad geben in dem Baum von UNAV.
Und wenn, das wird ein Kreis mit der Kante hier,
da habe ich einen Kreis.
Und wenn der hier schwarz ist und der weiß und die beiden und diese Kante kreuzt den Schnitt,
dann muss es danach auch nochmal irgendwo eine Kante geben,
die einen Schnitt kreuzt.
Weil irgendwo muss nochmal ein Knoten gehen, irgendwo wird es
das erste Mal weiß. Wenn du von hier losgehst,
das ist ein schwarzer Knoten und du gehst jetzt diesen Kreis
entlang, irgendwo musst du das erste Mal weiß werden.
Und selbst wenn es hier das erste Mal weiß werden würde beim Knoten V,
dann ist eben diese Kante eine, die den Schnitt ebenfalls kreuzt.
So, und wenn du jetzt diese Kante XY hast und du weißt,
die kreuzt den Schnitt, die Aussage war ja,
dass A den Schnitt respektiert,
also dass sowas gerade nicht auftritt für Kanten in A,
also kann die Kante nicht in A sein
Ja? Ich frage mich gerade, wo das kommt.
Ich dachte, das hätte ich irgendwo geschrieben. Nicht den
richtigen, sondern einen. Richtig sind sie ja quasi alle,
es sind ja alles minimale Spannbäume, die sind alle super,
aber ich rechne mir halt einen aus.
Und du kriegst quasi auch unterschiedliche raus oder du kannst unterschiedliche rauskriegen,
je nachdem, was du für ein Verfahren gleich machst,
um die sicheren Kanten rauszuwählen
Je nachdem, wie du raufguckst und je nachdem,
wie du dann sicher in den Krankenhaus setzt.
Du kannst ja unterschiedliche Schnitte nehmen und du kannst unterschiedliche sichere
Kanten rausnehmen. Und dadurch unterscheidet sich dann teilweise eben,
auf welchem minimalen Spannen, wo du kriegst.
Kurz mal zur Aufführung. Kreuz den Schnitt, was meint
das? Den Schnitt kreuzen heißt, ein Eckpunkt ist in
der einen Partition, der andere in der anderen.
Partition ist eigentlich das Gleiche, aber die eine Kante schwarz,
die eine, deine Knoten ist schwarz, der andere weiß.
Ja, von denen ist immer so eine Menge da
Jein, also einer ist schwarz, einer ist weiß.
Also zum Schnitt gehört ja hier beides. Also der Schnitt
ist ja S- und V-S. Das ist auch die Partitionierung und
ich weiß jetzt gerade nicht, wie die einzelnen Sachen hießen,
ob die einzelnen seinen Partitionen hießen oder nicht,
aber quasi die einzelnen Komponenten so.
Eine Kante kreuzt halt einen Schnitt, wenn einer ihre Eckpunkte
in der einen Komponente dieser Partitionierung ist und die anderen in der anderen.
Nee, im Spannbaum sind sie alle. Ja,
ich meine, in dem wäre das jetzt schon konstruiert.
Du meinst jetzt bezüglich dieser Menge A, ne
Nee, die können ja auch in dem Beispiel,
sind sie ja auch beide drin. Wenn du dir die
dicken Kanten anguckst, X und Y sind beide drin.
Okay, weiß ich nicht. Woher kommt von dieser Select,
wird der vorbestanden? In dem Satz ist er gegeben und
gleich beim Ausführen werden wir sehen, wo der herkommt. Naja,
der Algorithmus gleich, also der Algorithmus macht gleich sowas,
dass er sagt irgendwie, ich habe schon diese Teilmenge A,
ich bestimme jetzt irgendeinen Schnitt im Hintergrund,
ich bestimme jetzt eine sichere Kante und nehme die hinzu
Und das, was wir zeigen wollen, ist,
dass es okay ist, die hinzuzufügen. Dass also quasi,
wenn ich zu A, eine sichere Kante hinzufüge,
dass das weiterhin das, was dann entsteht, das Arschstrich,
dass das weiterhin Teilmengen eines minimalen Spannbaums ist. Ja,
jetzt könnte es sein, dass das war dieser erste Fall,
den wir quasi im ersten Satz abgefrühstückt haben,
dass die Kante, die ich nehme, diese sichere,
dass die schon Teilmenge meines Spannbaums ist,
oder dieses minimalen Spannbaums Tee ist,
dann ist aber nichts zu zeigen.
Wenn die Kante, die ich so rauswähle,
aber quasi nicht, zu einem minimalen Spannen,
also zu dem minimalen Spannbaum Tee gehört, dann muss ich irgendwie was machen.
Also hier ist ja die Aussage, Mhm.
Genau. Hier, sei A, Teilmenge eines minimalen Spannbaums.
Damit wissen wir nur, es gibt einen minimalen Spannbaum-Tee,
von dem A eine Teilmenge ist. Wir wissen aber nicht,
dass wenn ich jetzt eine sichere Kante UV hinzufüge,
dass A vereinigt mit UV weiterhin Teilmenge dieses,
genau dieses minimalen Spannbaums Tee ist,
weil es gibt ja mehrere minimale Spannbäume, so,
also zumindest kann es mehrere minimalen Spannbäume geben,
einfach so das Beispiel ein Kreis,
wo alle Kanten das gleiche Gewicht haben oder irgendwie sowas
Genau. Du weißt jetzt nur, dass A, eine Timeenge von Tier ist.
Und wenn du jetzt UV hinzunimmst, kann es aber sein,
dass A vereinigt mit UV nicht mehr Teilmenge von diesem Tee ist.
Und deswegen muss sie zeigen, dass es dann aber Timeeng
eines anderen minimal spannend warum es ist. Und das,
was quasi daraus folgt, ist,
dass ich gleich so Sachen machen kann, wie, oh,
okay, wenn ich Arsch und irgendwie habe und ich habe eine Partitionierung.
Und also ein Schnitt und dieser Schnitt respektiert A,
das muss alles gelten so, dann weiß ich,
jetzt kann ich mir eine leichte Kante nehmen.
Die leichte Kante ist denen ja relativ einfach zu bestimmen vielleicht so.
Und jetzt weiß ich, okay,
die darf ich hinzunehmen
Das ist weiterhin okay, weil ich will ja dahin kommen,
dass dieses sicher die ganze Zeit gilt,
damit meine Schleifeln-Variante von vorhin die ganze Zeit gilt,
damit der Algorithmus korrekt ist.
Ich kannte XY, Tischterich, nachher die Kante.
Und wir sagen, Tee ist minimal ein Spannbau.
XY hat aber ein höheres Gesicht als ein Bauch,
wie kann das dann minimaler Spannbau sein?
Nee, wird es nicht haben. Das wird das gleiche Gewicht haben.
Die werden das gleiche Gewicht haben. Da standen immer so Sachen hier,
falls du noch an diesem,
falls du daran gerade denkst,
hier stand dann immer explizit kleiner gleich und da auch kleiner
gleich und da auch kleiner gleich und dann stellt man nachher
fest,
die müssen alle
gleich sein
Sonst würde genau das passieren, was du meintest.
Also wenn XY höheres Gewicht hätte als UV, dann ist Tega
kein minimaler Spannbaum. Wir gehen ja vom minimalen Spannbaum aus,
das funktioniert nur, wenn die Kanten tatsächlich das Gleichgewicht haben.
Wenn es sowas aber nicht, also wenn der Fall gar nicht eintritt,
dann wäre entweder UV oder XY nicht sicher,
dann funktioniert das quasi bei den Voraussetzungen nicht.
Warum nehmen wir da nicht XY zu A hinzu?
Weil wir ja nicht, also wir sagen nicht,
war da anders, weil wir nicht wissen,
wie die sichere Kante gewählt wird.
Die Aussage von dem Lämmer ist ja gerade nur,
wenn du eine sichere Kante nimmst,
dann ist auf jeden Fall super
Und jetzt kann es aber mehrere geben. Und je zwei Algorithmen,
die wir gleich machen, die wählen die auch unterschiedlich aus.
Aber bei beiden ist es so, dass man weiß,
alles klar, die bisher gewählten Kanten sind irgendwie so eine Teilmenge,
ah, die Teilmenge eines minimalen Spannbaums ist.
Ich habe eine Partitionierung,
ich habe bei beiden gleich eine andere Partitionierung im Hinterkopf,
aber ich weiß, es ist eine und ich weiß,
bei beiden jetzt will ich bezüglich dieser Partitionierung eine sichere Kante aus und daraus folgt dann,
dass das ganze Verfahren korrekt ist.
Nicht Grafen, sondern Spannbaum. Also der Graf G,
der enthält noch mehr Kanten
Und in dem Beispiel,
wir sollten jetzt die durchgezogenen Linien, das sind die,
die ein T sind und die gestrichelte,
das ist die eine aus G, die ich dargestellt habe,
weil sonst das Bild irgendwie wenig aussagekräftig ist.
Und die anderen Kanten von G sind da gar nicht gezeichnet.
So, aber die existieren. Ja, NG.
Und irgendwo steht das hier noch irgendwo am Anfang?
Die Kante UV-Gehör zu gehen, nicht zu Tee.
Und hier steht nochmal, die Kanten von Tee sind eingezeichnet,
nicht die von G. Da müsste man genauer sagen,
die Kanten von Tee sind durchgestrichen, eingezeichnet, nicht
die von G. Und die Kante UV explizit,
das ist die eine Kante, die eingezeichnet ist,
die eben nur zu G gehört und nicht zu Tee.
Damit eben dieses Argument klappt,
oder irgendwie tauscht die aus
Das ist ja auch nur eine, also es ist eine Illustration,
aber ich, glaube ich, bin es eingängig.
Ja. A, ist Timemenger, ist mich mal entspannt,
warum es? Okay, aber jetzt sieht man doch,
dass man, wir haben noch einen Teil,
der Weg eingezeichnet wird und noch einen anderen.
A, ist Teilmenge eines minimalen Spannen bei uns. Die durchgezogenen Linien,
das ist der minimale Spannbaum, also alle Linien,
außer die gepunktete, das ist der minimale Spannbaum und die dick hervorgehobenen,
das sind jetzt die Kanten dieses minimalen Spannbaums,
die ich quasi schon bestimmt habe
Und die Aussage ist jetzt, jetzt will jemand UV dazunehmen,
weil er sagt, das ist ja super, die ist sicher.
So, und jetzt stelle ich fest, oh,
das liegt gar nicht auf einem minimalen Spann,
warum ist denn das immer noch ein minimaler Spannbaum?
Und das beweist man da gerade. Dass man sagt,
ja, das ist wirklich immer noch minimaler Spannbaum,
weil ich kann XY rausnehmen, UV einfügen, fertig.
Sonst noch. Genau, so,
den haben wir gezeigt
Jetzt kann man sich noch mal kurz überlegen,
wie das bei diesem generischen Algorithmus abläuft, zu jedem Zeitpunkt gilt das folgende, ASA-zyklisch.
Ja, okay, AS Teilmenge eines minimalen Spannbaus,
da kann kein Zyklus drin sein, das ist irgendwie, ist klar,
der Graf GA, das ist quasi der Graf G,
wir nehmen die gleichen Knoten, aber wir nehmen nur diese Menge A raus.
Das ist ein Wald, dessen Zusammenhangskomponenten Bäume sind. Muss er sein,
weil hier steht ja gerade ASA-zyklische,
also kann da irgendwie keine Kreise entstehen,
sprich das Ganze ist irgendwie eigentlich ein Baum,
aber weil ich jetzt ja auch hier eine Kante nehmen kann und da eine Kante nehmen kann,
so wie man das auch bei Großguy macht,
habe ich halt mehrere Bäume irgendwie,
also einen Wald
Und da nochmal wichtig, eventuell bestehen einige nur aus
einem Knoten, aber dann ist das halt so.
Also es gibt hier ganz bestimmt, vor allem am Anfang
so ganz viele isolierte Knoten. Und dann hier jede für
A sichere Kante verbindet unterschiedliche Komponenten von A. L von GA.
Auch relativ klar, weil wenn die Kante innerhalb einer Komponente
wäre, dann würde ich da gerade den Kreis einbauen.
Das wäre schon eine Komponente habe. Und ich füge da jetzt noch
eine Kante zu, beide Enden in dieser Komponenten sind,
dann habe ich einen Kreis eingebaut.
Ich auch nicht. Genau. Und sicher impliziert ja auch,
dass quasi beide Enden Also, dass die Kante den Schnitt
kreuzt. Da klappt das auch nicht. Oh,
jetzt gibt es noch diese Folgerung und dann kann man,
daraus kann man dann nämlich gleich die Korrektheit schön ableiten.
Wenn ich weiterhin diesen zusammenhängenden ungerichteten Grafen habe mit der Gewichtsfunktion,
ich habe diese Teilmenge A,
eines minimalen Spannbaums und jetzt sage ich,
dieses C soll jetzt eine Zusammenhangskomponente von diesem Grafen GA sein
Also ich habe jetzt diesen Grafen GA, sprich,
ich habe schon ein paar Kanten in A drin und jetzt nehme ich mir in GA eine Zusammenhangskomponente.
Möglicherweise ist das nur ein einzelner Knoten,
möglicherweise ist das aber auch irgendwie ein Teil,
so ein Block schon,
der in Ei wie drin ist und dann ein einzelner Knoten oder
ich habe hier einen Block und da einen Block von Kanten
und so wie eben in dem Beispiel und ich nehme dann eine Kante,
die das verbindet oder so.
Aber genau, ich habe jetzt hier so eine Zusammenhangskomponente und UV
ist jetzt unter allen Kanten die C mit einer anderen Komponente verbindet,
die mit dem kleinsten Gewicht.
Dann ist UV sicher und das ist genau das,
was wir die ganze Zeit bei Kruskal machen
Wenn ich irgendwie ein paar Kanten schon gewählt habe,
so, dann könnt ihr mir vorstellen, dem Grafen,
irgendwie ein paar Kanten sind schon gewählt,
dann nehmt ihr eine Zusammenhangskomponente raus und sagt,
okay,
davon nehme ich mir so eine Kante jetzt hier und die verbinde ich mit irgendwie einer anderen Komponente von GA.
Und unter all diesen Kanten nehme ich mir jetzt eine,
die das möglichst geringste Gewicht hat.
Das ist genau das, was im Algorithmus von Kruskal passiert.
Was sich immer eine Komponente mit einer anderen verbinde in diesem Grafen GA.
Und da nehme ich nämlich auch immer die mit dem kleinsten Gewicht.
Also aus dem Satz, wenn der gilt,
folgt aus dem Satz sofort die Korrektheit von Großkalsalgorithmus
Wenn UV für A sicher ist. Und mit dem Satz von ihm
ist das relativ schnell gezeigt hier. Wenn man nämlich diese Komponente nimmt,
VC, und man sagt jetzt einfach,
ich betrachte jetzt den Schnitt, der daraus entsteht, dass ich sage,
einmal nehme ich mir die Knoten aus VC und einmal nehme ich mir alle anderen.
Also einmal VC und V-VC, dann habe ich einen Schnitt.
Und der respektiert A. Warum? Sonst wäre VC eben keine
Zusammenhangskomponente hier. Achso, die muss maximal sein. Ach
, das wollte ich noch hinzufügen. Also die Zusammenfasskomponente muss möglichst groß sein. Irgendwie,
wenn ihr zwei rote Kanten quasi habt, also zwei Kanten,
die schon in A sind, dann müsst ihr jetzt,
wenn ihr davon was als Zusammenhangskomponente nehmt,
das Ganze nehmen und nicht irgendwie nur diese,
sonst würdet ihr den schon nicht singen respektieren
Genau, und UV ist eine leichte Kante für den Schnitt.
Naja, und dann folgt das sofort aus dem eben bewiesenen Satz.
Ihr habt dann irgendwie hier den Schnitt, der Schnitt respektiert
A und ihr habt eine leichte Kante für diesen Schnitt.
Das sind genau die Voraussetzungen, die ihr hier haben wollt.
Ja, einen Schnitt, der respektiert diese Menge A
und ihr habt eine leichte Kante.
Dann wurde gesagt, dann ist die Kante sicher.
Also folgt das da sofort. Und das ist halt genau das,
was jetzt bei Großkalt passiert und auch was bei Prim gleich passiert,
nur dass bei beiden quasi hier von anderen Zusammenhangskomponenten immer ausgegangen wird.
Also dass man quasi anders auf dem Grafen drauf guckt,
um die nächste sichere Karte zu bestimmen
Genau. Das hatten wir schon, dass wir
das jetzt machen wollen. Dann ist die Menge A,
die ist im Wald und die hinzugefügte sichere Kante,
ist immer eine Kante, die mache ich wirklich,
die zwei verschiedene Komponenten von GA verbindet.
Ich bin schon auf Folie 19. Was schaffe ich noch?
Kein Problem. 1942, jetzt komme ich auch
ganz viele Bilder
Beispiel. Jetzt kommen wir erst mal 20 Folien,
glaube ich. Das Ding hatten wir eben schon,
nur dass man das jetzt einmal so im Ablauf sieht.
Am Anfang ist A leer. Jetzt besteht dieser Komponentengraf hier
, dieses GA. Das war hier der da. GA
. Der hat jetzt alle Knoten und eine leere Kantenmenge.
Also alles. So, jetzt nehmt ihr da eine maximale
Zusammenhangskomponente raus. Naja, da ihr keine Kanten habt,
ist das also ein einzelner Knoten.
Und ihr sagt, den möchte ich jetzt gerne mit einer
anderen Komponente verbinden
Und das wollte so machen, dass sie das kleinste Gewicht hat.
Müsste man, also nach dem Satz von eben,
müsste man da nicht anfangen. Also wenn man erstmal sagt,
irgendwie, ich nehme eine Komponente,
dann kann ich quasi einen beliebigen Knoten rausnehmen.
Und jetzt gucke ich mir nur die Kanten an,
die von diesem Knoten ausgehen.
Weil ich will ja jetzt diese Komponente mit den,
mit irgendwas anderem verbinden. Und dann würde ich da die
mit dem geringsten Gericht rausnehmen
Das wäre aber auch okay, dann würdet ihr,
was weiß ich, wenn ihr hier mit J anfangt,
dann habt ihr halt die Möglichkeit zwischen 10 und 14 zu wählen,
dann wählt ihr halt die 10.
Da kommt auch nachher das Richtige raus,
aber es wäre halt ein anderes Verfahren so.
Dann würde man da irgendwie die Knoten irgendwie anders wählen.
Vielleicht macht man das dann so wie primgleich. Und Kruska hat halt gesagt,
wenn ich immer die mit dem geringsten Gewicht nehme, dann geht das auch,
weil da verbinde ich jetzt ja gerade zwei Komponenten miteinander.
Im nächsten Schritt will er jetzt hier die mit 2 haben,
also entweder GEI oder BC.
Und da ist es ja auch so,
er guckt ja explizit nach, entsteht da kein Kreis.
Und wenn da kein Kreis entsteht, bedeutet das,
dass da eine Komponente,
die er schon irgendwie hat,
mit einer neuen verbindet
Also, dass man diese ganzen Geschichten hat, von wegen,
es gibt einen Schnitt, ich kreuze den Schnitt und so weiter.
Kommt die Kante und die Kante kommt hinzu, dann kommt die Kante hinzu.
Jetzt kommt die drei hinzu. Und jetzt,
wie gesagt, ist das erste Mal hier,
dass man jetzt irgendwie die vier hinzunehmen will.
Da stellt man fest, das ist aber keine Kante,
die eine Komponente mit der anderen verbindet.
Also nehme ich die gar nicht dazu. Oder Großkalt prüft eigentlich,
entsteht da durch den Kreis, aber vom Korrektheitsbeweis her würde man sagen,
die Kante nimmt man nicht, weil die nicht zwei Komponenten miteinander verbindet.
Oder anders ausgerückt, immer wenn Krosköl eine Kante nimmt,
verbindet die zwei neue Komponenten miteinander und deswegen ist die sicher
Vier, also nicht fünf klappt wieder, fünf klappt.
Die sechs klappt nicht, würde wieder in Kreise stehen.
Die sechs klappt, dann entsteht kein Kreis.
Und dann immer so weiter, sieben, acht, zehn.
Und jetzt könnte man schon feststellen, dass man genug Kanten hat,
wenn man die roten Kanten die ganze Zeit mitzählt,
stellt man jetzt fest, ich habe jetzt N-minus eins Kanten und kann aufhören.
Ansonsten würde man jetzt, wenn man über alle Kanten rübergehen will,
würde man jetzt halt immer feststellen,
da entsteht ein Kreis, da entsteht ein Kreis,
da entsteht ein Kreis und ist dann fertig.
Aber man könnte halt auch was effizienteres einfach mitzählen,
wie viel Kanten man
schon genommen hat
Fertig. Verfahren ist klar, das Verfahren ist irgendwie einfach.
Also wie gesagt, wenn man jetzt irgendwie eine typische Klausuraufgabe gegeben,
der Graf, malen Sie mal den Spannbaum rein,
den Sie mit dem Algorithmus von Kruskal kriegen.
Relativ einfach. Man sortiert die Kanten nach Gewicht,
geht die irgendwie durch, nach aufsteigendem Gewicht.
Und nur dann, wenn ein Kreis entsteht,
nimmt man die Kante nicht, sonst nimmt man die halt.
Also vom Ausführen ist das relativ einfach.
Aber zu argumentieren, dass das Verfahren tatsächlich korrekt ist.
Habt ihr ja gesehen, ist relativ aufwendig.
Deswegen verdient das Ding auch den Namen Algorithmus von Kruskal.
Also es wäre ein bisschen beschämend,
wenn so eine Idee gleich mit dem Namen benannt wird.
Dann will ich auch den Algorithmus von Heidmann haben
Das ist also das,
wenn man von der kürzesten Verbindung ausgeht und sich dann hocharbeitet,
bis man einen vollen Baum erreicht, das muss man nicht weitergucken,
weil so irgendeine Kante, die Joses, noch dazuzug,
wie müsste man ja eine rausnehmen,
damit es immer noch einen Baum ist.
Und wir haben gerade mit dem Platz vorher bewiesen,
dass dann unser Baum immer länger werden würde, als wir so einen Axobiten haben.
Dafür, also ja, aber dafür haben wir den Satz nicht gezeigt.
Sondern das ist ja quasi, also das,
warum wir da, du meinst jetzt, warum wir aufhören,
wenn wir nur noch die Kanten ab 11 da haben, ne?
Naja, das, warum wir dann aufhören.
Das kann man bestimmt auch aus dem Satz von jedem Schlussfolger
, das kann man auch viel schneller Schluss folgern.
Ich weiß, ich habe schon einen Baum
So, und alle kannten, die jetzt kommen,
sind teurer. Dann sollte ich die nehmen. So,
da brauche ich den Satz von eben eigentlich nicht für.
Es ist so, das würde ich anders argumentieren einfach.
Da würde ich sagen, ich habe schon minimalen Spannbaum.
Und ich habe schon einen Spannbaum so und der kann jetzt
nur noch teurer werden. Genau, den Satz von eben,
den braucht man tatsächlich, um argumentieren zu können, dass,
wenn ich eben diese Kanten hinzunehme, dass das immer okay ist.
Dass man irgendwie sagen kann, wenn ich, ja,
hier nehmen wir mal die Stelle,
wenn ich an der Stelle hier die Sieben hinzunehmen will,
dann weiß ich,
ich habe hier die Menge A oder ein Teil der Menge A,
hier ein Teil der Menge A,
also sprich diese ganzen roten Kanten
Und aus denen kann ich einen Schnitt rauslesen. Und dann weiß ich,
also ich nehme quasi alle Knoten,
die mit diesen roten Kanten zu tun haben,
die nehme ich in meine eine eine Menge,
die anderen tue ich alle in meine andere.
Das ist ein Schnitt. Und dann weiß ich, diese Kante hier kreuzt den Schnitt.
Und ich weiß, die ist minimal unter all den Kanten, die das tut. Also sicher, ich kann sie hinzunehmen. Daraus,
also deswegen folgt aus den Sätzen von eben,
dass der Algorithmus korrekt ist, weil ich quasi,
immer wenn ich irgendwie so eine Teilmenge A bis hier bestimmt habe,
ich mir daraus einen Schnitt rauslesen kann,
für den Satz, den brauche ich nur für den Satz,
den brauche ich nicht im Algorithmus rein,
nur für den Satz, dass ich dann sagen kann,
okay,
ich habe jetzt eine Teilmenge A eines minimalen Spannbaums,
das weiß ich aus der Schleifenvariante
Habt so einen Schnitt. Und ich habe,
der Schnitt respektiert die Teilmenge A, weil ich ja
quasi aus der Menge A die Schnitt konstruiert habe.
Und die Kante da ist eine leichte, den Schnitt kreuzende Kante.
Und dann sagte er, der Satz mir,
dann darfst du sie nehmen, die ist sicher.
Deswegen darf diese Sieben da dazu nehmen. Genau. So,
und wenn, also die erste interessante Beobachtung ist,
dass man sagen kann, Idee ist sehr einfach,
Korrektheitsbeweis knifflig.
Jetzt ist, ja
Ach so, nee, das ist in dem Beispiel blöd,
weil ich glaube, in dem Beispiel,
so wie es konstruiert, also da gibt es,
glaube ich, nur einen minimalen Spannbaum.
Deswegen ist das da ein bisschen doof, das zu sagen mit dem XY und so.
Also wenn die Kante hier auch das Gewicht sieben hätte.
Die Zwölfer-Kante, wenn die auch das Gewicht sieben hätte,
dann könnte man so argumentieren. Dann könnte man sagen,
A, ist Time-Menge eines minimalen Spannbaums, das weiß ich,
aber dieser minimale Spannbaum mit hält jetzt vielleicht gerade die Kante EF und mein Algorithmus aus irgendwelchen Gründen,
was weiß ich vielleicht, weil danach Buchstabensortierung durchgeht,
würde jetzt als sichere Kante DF rausnehmen.
Er guckt sich an, welche sind möglichst günstig,
da sind diese zwei sieben Erkannten und dann sortiert er die noch alphabetisch.
Dann sagt er, oh ich nehme die Kante DF statt EF
und dann muss ich halt in diesem Satz eben irgendwie gezeigt haben,
oh, das ist aber auch okay,
wenn du die nimmst,
weil auch diese Kante gehört zu einem minimalen Spannbaum
Was hätte ich gerade gesagt? Genau, Idee ist einfach,
Korrektheitsbeweis ist knifflig und hier kommt jetzt noch dazu, dass auch die Implementierung ziemlich knifflig ist.
Ich schneide die nur mal kurz an,
was man braucht ist, oben steht es drüber,
so eine Datenstruktur für das junge Mengen,
dass man quasi irgendwas hat, mit dem man solche Mengen hier,
dass ich sagen kann, ich habe eine Menge von Mengen,
S1 bis SK, dass ich die verwalten kann,
diese S1 bis SK,
das sind jetzt quasi die einzelnen Komponenten in diesem Grafen GA
Sodass ich sagen kann, ich habe hier eine Knotenmenge,
die zu einer Zusammenhangskomponenten gehört, hier eine Knotenmenge,
die zu einer Zusammenhangskomponenten gehört, vielleicht noch jede Menge einzelne Knoten,
die jeweils ihre eigene Zusammenhangskomponente sind und sowas.
Und das möchte ich verwalten,
was ich dann nämlich sagen kann, ich nehme diese Kante,
die kannte halt zwei Knoten und dass ich schnell nachfragen kann,
liegen diese beiden Knoten in einer Menge oder liegen die in unterschiedlichen Mengen?
Und wenn die in unterschiedlichen Mengen liegen,
dann würde ich die ja jetzt, dann will ich die
Kante dazunehmen und die beiden Mengen zusammenfügen zu einer Menge,
deswegen dynamisch.
Die sind alle desjungd,
weil kein Knoten ist in zwei Mengen,
aber ich habe da ständig Änderungen drin
Und was ich halt brauche,
also und jede Menge soll durch einen Repräsentanten dargestellt werden,
dann kann ich nämlich nachher einfach fragen bei dieser,
bei der Ecke einer Kante, ist die da drin oder nicht.
Ja, und dann braucht man halt so solche Methoden hier,
insbesondere brauchen wir Findset und Union, ne,
da kann ich dann irgendwie sagen, Knotenfau, zu welcher Menge gehörst du denn?
Und dann kann ich mit Union und so gucken,
also dann kann ich gucken, ist das die gleiche,
wenn es die gleiche ist,
dann würde nämlich ein Kreis entstehen und wenn nicht, kann ich die Union machen.
Das ist aber relativ aufwendig, das zu implementieren,
vor allem das schnell zu implementieren, aber nur,
wenn man das hier schnell implementieren kann,
kann man diesen Algorithmus von Krusk halt schnell implementieren
Weil wenn man die Operationen hier, Feind und Union,
wenn man die naiv macht, so mit Broot for Ost,
dann würde man eben genau solche Sachen machen.
Ich nehme eine Kante raus, die hat die Knoten-UV
und dann gehe ich irgendwie alle Komponenten durch und gucke,
ob dadurch ein Kreis entstehen würde oder irgendwie sowas,
das wird langsam.
Also sprich, muss das da effizient machen,
dann kann ich den Algorithmus so schreiben hier.
Ab Zeile 5 passiert quasi das Spannende,
das davor ist die Vorbereitung
Die sechste Zeile ist ein bisschen irreführend. Bei der
sechsten Zeile steht für alle, aber gemeint ist quasi,
dass sich das eh in aufsteigender Reihenfolge durchgehe.
Also ich fange an mit dem Kleinsten, dem dann das Nächstgrößere und so weiter.
Deswegen sortiere ich vorher in der fünften und danach gehe ich eh durch.
Genau, und dann gehe ich halt aufsteigen durch.
Und dann nehme ich mir so eine Kante und dann gucke ich immer,
Findset U liefert mir ja quasi den Repräsentanten der Menge in der U
ist und Findset V liefert mir den Repräsentanten der Menge,
der V ist.
Und wenn die gleich sind, bedeutet das UV würde gerade
einen Kreis machen. Weil U und V schon in der
gleichen Komponenten sind, nur eben mit einer anderen Kante.
Wenn ich die Kante dazu nehme, ist das doof.
Wenn das nicht der Fall ist, würden die zwei neue Mengen miteinander verbinden.
Deswegen nehme ich das zu A hinzu. Und dann muss
ich aber auch dafür sorgen, dass diese Menge jetzt vereinigt wird,
weil jetzt ist es nur noch eine Komponente,
bis sie hatte hier unten eine Komponente, da eine Komponente.
Ich habe die Kante genommen, die die beiden verbindet,
dann ist das Ganze jetzt eine Komponente.
Deswegen muss ich jetzt die beiden Mengen verbinden.
Deswegen noch die Union-Operation. Wenn man quasi hier das Makeset,
Findset und Union hätte, dann ist er schnell implementiert.
Da ist noch hier drin, eh erstmal zu sortieren,
ist auch noch ein bisschen aufwendig,
aber da kennen wir schon Algorithmen für
Ja, das ist Großkall. Korrektheit folgt aus den vorherigen Sätzen
. Laufzeit hängt, wie gesagt, stark von den Methoden
ab. Kann man zeigen, dass das damit dann ein
Ehemalok V ist, was ja ganz okay ist.
Und wenn euch das genau interessiert mit der Implementierung,
also mir reicht es, wenn ihr das quasi von eben wisst,
wenn ihr da dann tiefer einsteigen wollt,
dann müsstet ihr ja euch mit diesen Datenstrukturen für das junge Mengen beschäftigen.
Das steht im Kapitel 21, zumindest in meiner Ausgabe vom Corman.
Wenn euch das interessiert, wie man das implementieren kann,
könnte das danach lesen
Es war jetzt hier so, dass ich, ich glaube,
ich brauche die an keiner anderen Stelle mehr in der Vorlesung, diese Datenstruktur.
Deswegen war das das, wo ich gedacht habe, Kida.
Kaum was geben. Frank. Also du machst am Anfang
für jeden Knoten quasi seine eigene Menge.
Das sind die einzelnen Komponenten in dem Grafen.
Wenn jetzt eine Kante dazu kommt,
wir sind jetzt schon ein bisschen weiter,
jetzt hast du hier unten irgendwie mehrere rote Kanten und da oben mehrere rote Kanten.
Jetzt ist das
eine Komponente und das eine Komponente
Wenn du jetzt irgendwie eine Kante hinzunehmen willst und die ist schon in dieser Komponente,
also dass hier vielleicht bisher so ein Strang,
und jetzt willst du eine Kante nehmen,
die so geht oder sowas, die würde jetzt diese Komponente verbinden.
Was du jetzt machst, ist, diese Menge hat einen Repräsentanten,
das ist der Knoten-X oder irgendwie sowas, ne?
Was du jetzt machst, um diese Kante hinzuzufügen, ist,
du fragst nach, in welcher Menge liest du eigentlich und in welcher du?
So, jetzt sagen sie beide, wir gehören zu X und sagst du,
alles klar, die Kante würde also irgendwie einen Kreis machen.
Wenn du das von vorheren hast,
hier unten hast du eine Komponente da zu einem Komponenten,
dann sagt er, ich gehöre zu X,
also mein Repräsentant ist X, der sagt,
meine Repräsentanz ist Y, dann weißt du,
alles klar, ihr gehört zu unterschiedlichen Komponenten,
also kann ich dich hinzunehmen.
Und du nimmst dann die Tante UV hinzu,
nicht XY, aber das X und Y quasi als
Repräsentant für die einzelnen Komponenten
Julian macht dann sozusagen, dass die Inhalte von VLB-Wechseln, VLB-Wechseln sind.
Ja, also ja, im Grunde genommen einfach eine Mengen-Union,
ja. Also was man dann halt machen muss,
um dem Beispiel von eben zu bleiben,
ich habe diese beiden Mengen hier und dann weiß ich,
ich nehme die Tante hinzu, also ist das jetzt eine Komponente?
Also soll die auch nur noch einen Repräsentanten haben und so und was ich dann halt datenstrukturtechnisch mache,
ist genau, eine Menge wird gekillt,
wird mit der anderen vereinigt sozusagen, hat mir noch eine,
so und dann kriege ich die einen Repräsentanten und das ist gut.
Ja, wo muss man das zwangsläufig mit den Dissierungstraining machen,
kann man nicht einfach die dann mit Markierung arbeiten,
dass man Erstmal die Kanne ansortiert, sozusagen, damit er mit der nächsten anfängt.
Die kann man ja hinzunehmen,
weil vorher kein Knoten in der Teilmenge ist und dann die Knoten markiert,
die man hinzunimmt und dann immer nur guckt,
bei der nächsten Kanne sind beide clue und markiert,
weil nur dann würde ja ein Kreis entstehen, der dann so lange geht.
Du willst mit einer einzelnen Markierung arbeiten, ne?
Ich habe mich gerade gefragt, ob das vielleicht geht,
wenn ich mit Enmarkierungen arbeite oder irgendwie sowas. Ja,
da hast du das Problem, wenn du, wenn du,
nehmen wir mal, du hast hier unten jetzt irgendwie vier Knoten,
die Ja, Moment, wir brauchen erst mal,
räumen wir unterschiedliche Markierungen, weil sonst wären die markiert und die markiert.
Aber die kannte es ja okay, während die Kante nicht okay ist. Ist jetzt gerade bildlich klar,
wenn du nur arbeitest mit Markierung an oder aus,
dann kriegen, kriegt so eine Komponente hier unten,
die alle schon in A sind, also die Kanten,
die sind jetzt alle markiert, die Komponente hier oben,
die auch alle in Asien sind, auch alle markiert.
Aber eine Kante, die jetzt innerhalb dieser Komponenten wäre und
zwei markierte Knoten verbindet, ist nicht okay, eine Kante,
die von da nach da geht, wäre okay.
Jetzt könntest du noch sagen, okay, dann,
dann mache ich das anders.
Ich nehme N-Markierungen, eins bis N oder irgendwie sowas,
jeder Knoten kriegt am Anfang eine Zahl 1 bis N.
Und danach, immer wenn du jetzt verbindest,
setzt du die Markierung um
So, da hast du jetzt das Problem,
wenn du hier unten tausend Knoten hast,
die eine Komponente bilden und da oben hast du tausend Knoten, die eine Komponente bilden.
Wenn du jetzt sagst, ah cool, ich kann sie verbinden,
musst du einmal über tausend Knoten das Ding neu setzen.
Und genau das will man vermeiden. Und da ist es,
also deswegen ist es hier clever, weil man dann,
also wenn man es dann sauber inplentiert,
dann hast du halt so Sachen, wie dass du schnell rauslesen kannst,
ah, der Repräsentant von V ist der Knoten X,
der Repräsentant von U ist der Knoten Y,
das ist okay, fertig.
Und dann musst du nur irgendwie einmal umsetzen,
was jetzt der Repräsentant ist, statt alle Knoten anzufassen.
Das ist so grob die Idee irgendwie. Ich weiß auch nicht genau,
wie die implementiert wird, diese Datenstruktur,
aber ich müsste das jetzt auch nachlesen,
aber so von der Idee her,
das muss man dann halt nicht so oft drüber gehen
und so
Möchte sein, die Programme zu apprentieren, weil es auch
nichts gesagt hat, dass wir hier teilweise aufstecken. Das heißt,
wir müssen es in die Knorren schicken, das heißt,
in dem Punkt, wo es dann mit Ben,
die groß sind, die da Zeit nehmen,
wenn dann so mein Knoten in eine andere Menge zu verschieben ist.
Nee, nee, nee, nee, nee,
nee, nee, what was man?
Wenn es dich interessiert, musst du dir ganz genau angucken,
wie diese Datenstruktur da implementiert ist. Es ist nicht so,
dass du da irgendwie eine Menge Repräsentation hättest oder irgendwie sowas.
Weil dann passiert genau das, was du meintest.
Jetzt verschiebe ich da eine Menge rum, das will ich alles nicht machen.
Ich will das anders, also ich will es ja schnell machen und so.
Wie gesagt, lese es dir mal durch. Ich weiß es jetzt auch nicht hundertprozentig,
wie das abläuft, nur dass man eben nicht,
du hast da nicht irgendwie eine Repräsentation,
wo du irgendwie alle Elemente aufgelistet hast und astrein diese Partitionierung hast.
Du hast nur irgendwie Verweise auf den Repräsentanten.
Und das reicht. Für den Wettel zugleich,
aber das blöde umgekehrte Postgleit auch funktionieren,
also immer die größte Karte löschen, bis am Ende den neuen Spender bauen.
Ob es funktionieren würde, immer nur die höchste Kante zu löschen,
bis am Ende ein Spannbaum übrig bleibt.
Würde nicht funktionieren, weil er wurde ja so lange gehen,
bis wir den Subside an den Punkt angekommen werden,
wo die Kante ignoriert Wir haben heute etwas so verkürzt.
Das heisst, die Mutter, der Vater, ist gut,
der ist so gut. Ja. Also ich würde einfach argumentieren,
dass woher willst du wissen, ob das okay ist,
die Kante zu löschen oder nicht?
Also du hast jetzt die teuerste Kante so und jetzt willst du die löschen.
Jetzt müsstest du dir sicher sein, dass es okay ist,
sie zu löschen. Also zumindest aus dem Satz,
von dem kann man das jetzt nicht rauslesen.
Und wenn du immer testest, gibt es noch einen minimalen Spannbaum so,
dann schwimmst du die ganze Zeit die minimalen Spannungen,
das funktioniert auch nicht.
Wie lange sie es sagen, heiß
Man darf sie löschen, solange sie zu einem Kreis gehört.
Ja, das könnte man machen vielleicht,
aber dann müsstest du immer wissen, ob es Kreise sind.
Bestimmst die ganze Zeit Kreise. Da kann man vielleicht noch argumentieren,
das hatten wir mit Tiefensuche, dass man das irgendwie rauslesen kann.
Es kann auch einfach passieren, dass der Spannkorn zerlegt wird,
wenn mehrere Unterzeile, bevor wir fertig sind.
Also er könnte sich zum Beispiel eine Kanz herausnehmen,
die zwei Hälfte gespannt auf uns verbindet und die einfach weg rausgefallen ist,
weil er noch nicht fertig ist und dann auf einmal zwei Hälften,
weil er nicht erkannt hat, auf der Spannung,
wenn es noch weitergehen wird.
Genau, aber das ist ja die gleiche Argumentation,
dass man quasi nicht weiß,
darf ich die Kante rausnehmen oder nicht.
Also man braucht irgendwas, sagt er ja selbst,
er will die größte Kante rausnehmen,
aber danach soll das immer noch ein Spannbau möglich sein.
Aber genau das musst du
irgendwie prüfen
Ja, das wird schwierig. Also alles was. Ja,
das meinte er auch gerade, dass man irgendwie Sachen rausnimmt,
die auf Kreisen liegen so.
Also dass ich auf jedem Kreis die teuerste Kante rausnehme oder irgendwie sowas.
Das ist halt auch schwierig. Also weil wenn ich zwei Kreise habe,
drei, vier, fünf Kreise, die sind irgendwie miteinander verwoben,
welche darf ich jetzt rausnehmen, welche nicht.
Auf dem einen Kreis ist die teuerste,
auf dem anderen nicht oder irgendwie so, ich weiß nicht,
damit meine ich mir, glaube ich, Sachen kaputt.
Ich überlege gerade, ja, kontraintuitiv ist es nicht.
Also zu sagen, ich nehme teuerste Kanten weg,
um zur minimalen Spannung zu kommen, ist ja nicht kontraintuitiv so.
Aber da fehlt so ein einfacher Test so irgendwie,
während er hier einfach sagt, naja,
ich nehme die so lange dazu, wie keine Kreise entstehen,
so,
alles gut
Ja. Supi. So nach 100 Folien.
Ich bin auch schon in meinem Inhaltsverzeichnis oben,
besonders weit fortgeschritten, so erste Section, erste Interception.
Epressive. Prim. Machen wir primor nochmal,
das kriegen wir schnell hin.
Prim macht nämlich
was Ähnliches
Ich behalte jetzt quasi mein A. Also ich fange irgendwo an
. Eigentlich fange ich bei irgendeinem Knoten an,
irgendeinen Startknoten in dem eine Kante, so jetzt.
Das ist mein bisher bestimmtes A. Und jetzt gucke ich mir an,
welche Kanten führen jetzt von diesen beiden Knoten weg?
Also quasi werde ich Kanten führen aus dieser Komponenten weg.
Und davon wähle ich mir die mit dem geringsten Gewicht und nehme die auf.
Das habe ich eine größere Komponente, wie mir daraus wieder
die mit dem geringsten Gewicht nehme ich auf und so weiter.
Und verbinde dann immer mit einem isolierten Knoten. Warum funktioniert
das? Auch so ähnlich wie eben mit der Argumentation,
die Knoten, die ihr bisher bestimmt habt in dieser Knotenmenge A,
das ist eure eine Partitionsmenge in diesem Schnitt.
Und der ganze Rest ist was anderes
Naja, und dann könnt ihr immer sagen, naja,
wenn ich jetzt eine mit einem geringen Gewicht nehme,
dann kreuzt sie den Schnitt.
Ist also sicher. Menge A ist ein einzelner Baum,
die hinzugefügte sichere Kante ist immer eine Kante mit minimalem Gewicht,
die den Baum mit einem Knoten verbindet,
der noch nicht zum Baum hört.
Und aus dem Satz folgt das dann wieder, ne?
Jetzt habt ihr hier nämlich quasi, hier habt ihr die
maximale Zusammenhangskomponente, die gerade durch A quasi induziert wird.
Und dann wählt ihr unter allen Kanten die C mit
was Neuem verbinden, die mit dem kleinsten Gewicht aus.
Und dann klappt das wieder, dann ist die auch
wieder sicher
Am Beispiel.
Wenn man da beim Alter
Besser, ja, ja, besser. Wir fangen bei
dem Knoten A an. Am Anfang hat man,
am Anfang muss man das so machen,
dass man sagt, okay, ich nehme einen Startknoten,
damit man irgendwie die erste Kante nehmen kann.
Und dann guckt man von A,
es gibt die acht Kante, es gibt die elf Kante.
Welcher das geringste Gewicht? Acht. Also nehme ich
die von A, Achter das geringste Gewicht so.
Jetzt hat man eine Zusammenhangskomponente. Jetzt habe ich die Zusammenhangskomponente,
die USA und B besteht. Das ist jetzt meine
eine Menge des Schnitts und der Rest ist die andere.
Also in der Partitionierung. Ihr habt einmal die Menge AB und
einmal alles andere. Und wenn ihr jetzt Kanten haben wollt,
die den Schnitt kreuzen, dann können das eben nur die Kanten sein,
die hier irgendwie von A,
B ausgehen und irgendwie zu weißen Knoten gehen
Das sind die Kanten, 11, 3 und 2.
Dann nehmt ihr von denen wieder die mit dem geringsten Gewicht,
wird die 2. Und so macht ihr jetzt immer weiter.
Und dabei können keine Kreise entstehen, weil ihr ja immer eine Kante nehmt,
die von euren schwarzen Knoten zu den weißen Knoten gehen.
Einen Kreis könnte ja nur entstehen,
wenn ihr irgendwie zu einem schon schwarzen Knoten geht oder so.
Jetzt habt ihr da irgendwie die Kanten, 11,
3, 4. Naja,
nimmt man die 3. Und jetzt ist halt die 4er-Kante hier,
das ist halt keine, die den Schnitt kreuzt.
Also betrachtet man die gar nicht mehr. Sondern hat nur
noch hier die Kanten 11, 6, 12 und 7.
Da nimmt man irgendwie die 6,
Und jetzt geht das halt so weiter hier.
Jetzt nimmt man ja irgendwie die 1, die 5,
die 2. Und dann halt nochmal die 5 und nochmal
die 10 und dann ist man fertig.
Liefern Kruskal und Prim immer das gleiche Ergebnis?
Was meint ihr? Liefern Kruskal und Prim immer
das gleiche Ergebnis
Nö, genau. Finde ich auch nö. Nö. In
dem Beispiel jetzt nämlich, ja, aber das liegt daran,
dass der Graf genau einen minimal entspannbar macht.
Also wenn der Minimalen Spannbaum eindeutig ist,
dann müssen sie beide das gleiche Ergebnis liefern.
Also die haben ja beide dann nur die Möglichkeit,
einen minimalen Spannbaum zu liefern. Aber wenn es unterschiedliche minimale
Spannbäume gibt, dann können die unterschiedliche minimale Spannungen liefern.
Dann ist es aber sogar so, dass je nachdem,
wo ihr anfangt,
der Algorithmus von Primen unterschiedliche minimale Spannbäume liefern kann und auch der Algorithmus,
also quasi der Algorithmus für sich genommen schon
unterschiedliche Sachen liefern kann
Wenn man es dann nachher implementiert, macht man das natürlich deterministisch so,
dann hat man nicht die Möglichkeit, dann hat man vorneweg noch,
was weiß ich, irgendwie, ich sortiere,
die kannten nach Gewicht und dann nochmal alphabetisch so, dann ist klar,
welcher Spannbaum im Stehenbus mit Algorithmus von Großgeil muss das eindeutig sein,
aber wenn ich das halt nicht festlege,
wenn ich einfach nur sage, so, hey,
wir gehen so vor, dass wir sagen, wir nehmen einen,
wir sortieren die Kanten und da sind jetzt ganz viele Kanten,
die das gleiche Gewicht haben,
dann ist es halt erstmal nicht die terministische Schwäche,
die man davon auswählt.
Und bei Prim halt genauso, wenn ich einen anderen Startknoten nehme,
kann man was anderes rauskommen, so,
kann man sich immer sehr schnell klarmachen mit irgendwie,
keine Ahnung, einem Kreis mit,
wo alle das gleiche Gewicht haben,
je nachdem,
wo ich anfange,
kommt irgendwie
was anderes raus
Hier auch Schwierigkeit bei der Implementierung besteht darin,
die Auswahl der Kanten, die zu A hinzugefügt werden sollen,
möglichst einfach, das heißt effizient zu gestalten.
Da hat man jetzt ja auch wieder sowas, dass man sagt,
ich nehme eine minimale Kante unter all den Kanten mit einer bestimmten Eigenschaft.
Nämlich, dass sie irgendwie diesen Schnitt kreuzen.
Und hier kann man aber ganz schön mit Minenprioritätswarteschlangen arbeiten,
also mit Prioritätswarteschlangen,
wo das vorderste Element der Warteschlange
den minimalen Wert hat
Und wir haben das ja mal mit Max-Prioritätswarteschlangen uns angeguckt und
die mit Max Heebs implementiert. Wer das noch so grob erinnert,
da gab es so, dass man sagte,
der Max-Hieb ist irgendwie jetzt quasi die Prioritätswarteschlange,
dann ist nämlich die Wurzel des Max Heebs immer das mit dem höchsten Wert.
Und wenn ich den haben will, dann habe ich den rausgenommen,
habe das Element ganz rechts unten genommen,
habe es da oben hingesetzt und habe es im Baum nach unten wandern lassen,
dann hatte ich wieder ein Maxi.
Dann war das quasi wieder eine Warteschlange. Und bei Min-Hieb
macht man das im Grunde genommen genauso,
nur dass man eben hier die Reihenfolge von größer,
gleich kleiner gleich,
das tauscht man halt aus,
hat man halt das mit dem kleinsten Element
Genau, und die anderen Anmerkungen sehen wir auch gleich,
aber was man jetzt halt macht, ist,
man hat einmal die Knotennamen, die waren ja eben ganz groß geschrieben,
dann hat man Schlüssel von Knoten,
das ist quasi das kleinste Gewicht aller Kanten,
die V mit einem Knoten des bisherigen Baums verbinden,
man muss das dann nämlich ab und an mal aktualisieren und die Menge A,
die speichern wir gar nicht explizit,
sondern die ist implizit über diese Vorgänge gegeben,
was wir auch schon bei der Tiefensuche gesehen haben,
weil der Tiefensuche hat ja auch jeder Knoten,
dieses Pi von V gekriegt, wo man dann gesagt hat,
Pi von Faust, der Vorgänger des Knotens und wenn ich das alles aneinanderreihe,
kriege ich einen Baum raus und so merken wir uns jetzt quasi diese Menge A.
Im Beispiel sehen wir das gleich besser,
nur dass ihr schon mal wisst, so wir haben den Knoten,
wir haben den Schlüssel vom Knoten,
der uns quasi sagt,
was ist die günstigste Kante,
die es im Moment gäbe,
diesen Knoten mit dem bisherigen Baum zu verbinden und
wir haben den Vorgänger
Und dann sieht das Uhr aus hier. Erstmal mache ich bei allen Knoten das so,
dass ich den Schlüssel auf und endlich setze und den Vorgänger auf null,
nur bei dem Wurzelknoten, also dem, wo ich anfange,
eben der Knoten links oben in der Ecke,
da setze ich halt den Schlüssel auf null.
Und dann mache ich mir hier eine Q. Und da steckt
halt jetzt drin, das soll ja eine Minenprioritätswarteschlange sein.
Deswegen gibt es ja jetzt so Funktionen wie irgendwie
das Minimum zu extrahieren und all solche Sachen.
Also da steckt relativ viel von der Laufzeit hin. Wenn ihr das noch erinnert,
da mit diesem Bild Maxib und so, welche Laufzeit er hatte,
das müssen wir jetzt halt hier einmal machen,
dass man einmal so einen Hieb aufbaut, dann hat man das.
Und dann kann man halt, solange die Schleife,
solange die Tune nicht leer ist,
nimmt man immer
das Minimum
Mhm. Genau, nimmt das Minimum raus und guckt dann für alle Knoten,
die eben mit U benachbart sind,
ob der Knoten noch in der Q ist,
das kann man ja mit dem Flag machen, drin oder nicht drin.
Falls der nämlich nicht mehr in der Q ist, dann weiß ich,
das ist schon ein schwarzer Knoten, den habe ich schon bearbeitet.
Und falls der noch in der Q ist, weiß ich,
oh, der gehört noch zu den nicht betrachteten. Also,
falls der noch in der Q ist und der Wert der
Kante von U zu V geringer ist, als das,
was ich bisher meine, was ich bezahlen muss,
um zu V zu kommen,
dann setze ich eben den Vorgänger von U um und auch
den Schlüssel den Vorgänger von V um und auch
den Schlüssel von
Im Beispiel, das war eben nur zur Nachbereitung, im Beispiel,
hier steht jetzt immer der Knotenname als erstes, das Gewicht,
das wir zahlen müssen, wenn wir ihn hinzufügen wollen,
als zweites und Ende ist der Vorgänger.
Und am Anfang sind die halt alle quasi auf New gesetzt
und haben als Gewicht unendlich. So, und jetzt,
wenn man bei dem Knoten ist,
jetzt guckt er sich halt seine beiden Nachbarn an und sagt bei dem hier,
mein Vorgänger könnte A sein und das Gewicht,
was ich zahlen müsste, wäre acht.
Und hier sagt er, das Gewicht,
was ich zahlen müsste,
wäre elf und mein Vorgänger wäre dann auch
Und jetzt wird halt die Q aktualisiert. Die Q wird
ja nach dem zweiten Element aktualisiert. Das heißt,
in der Q sage ich jetzt,
der Knoten hier rutscht ganz nach oben in der Q,
weil der jetzt gerade den minimalen Wert hat mit der Acht.
Da muss ich also am wenigsten zahlen, um den zum Baum hinzuzufügen.
Dann kommt der dazu, also mit dem bin ich fertig,
der ist aus der Q raus und alles.
Jetzt nehme ich den in die Q rein.
Und wenn ich den hier in die Q reinnehmen will,
dann aktualisiere ich die beiden Knoten,
weil zu C und D kann ich jetzt kommen.
Kantengewicht ist zwei und drei. Also wenn ich
den hinzufügen will, dann müsste ich zwei zahlen,
wenn ich denen hinzufügen will, müsste ich drei zahlen.
Für beide wäre B der Vorgänger. Gut,
jetzt kommt der hier
Der Knoten C als nächstes. Weil die Q wird wieder
neu sortiert, C wandert in der Q ganz nach oben.
Hat das minimale Gewicht. Dann wird die genommen. Der
guckt sich jetzt seine Nachbarn an, der da oben ist
nicht spannend als Nachbar, weil der schon drin ist.
Also der ist nicht mehr in der Q drin.
Der hier ist spannend, der ist noch in der Q,
der hat aber als Gewicht drei, also ich müsste drei zahlen,
wenn ich ihn mit Vorgänger B aufnehme.
Und ich müsste vier zahlen, wenn ich ihn mit Vorgänger C aufnehme.
Vier ist teurer als drei, also aktualisiere ich nicht.
Lasse ich alles so. Jetzt hat der ja das Höchste,
äh das niedrigste Gewicht,
kommt der dazu
Jetzt passiert, dass,
ich glaube, das ist fast schon die einzige Stelle,
wo was Spannendes passiert, der sagt jetzt nämlich,
der Knoten hier, sein Nachbar eh, der behauptet bisher,
für Kosten 11 kann man mich hinzufügen und mein Nachbar ist dann A.
Und jetzt sagt er, hier ist es aber günstiger,
wenn ich dein Vater bin und ich koste nur sechs.
Ohne mit das hinzu. Es war vielleicht eine etwas unglückliche Formierung.
Und jetzt ist hier sowohl die Kosten sind aktualisiert worden als auch der Vorgängerknoten.
Und so geht das dann immer weiter durch.
Jetzt wird der als nächstes genommen, kann nichts aktualisieren,
weil den hier aktualisiert er nicht, weil der noch,
bei der nicht mehr in der Q ist,
den Knoten A und den Knoten F aktualisiert er nicht,
weil die Kosten
zu hoch sind
Jetzt ist irgendwie der Knoten hier mit der 1 am höchsten.
Und jetzt passiert nochmal was, weil er hier jetzt bisher sagen würde,
für Kosten 6 kann man mich hinzufügen,
mein Vater ist dann F und er sagt, hier,
die Kosten sollten nur 5 und dann ist Haar mein Vater.
Genau, und dann wird er auch genommen, zack,
zack, zack, zack, fertig. Und die Kantenmenge A,
haben wir jetzt halt nicht explizit gespeichert, sondern nur über diese Vorgängerfunktion und genau,
die Gewichte brauchen wir jetzt im Nachhinein auch nicht mehr,
weil die ja über die Kanten da sind, aber Das macht Prim.
Genau, wir machen gleich mal Pause,
was wir gleich nach der Pause nochmal machen, ist,
wir gucken uns noch mal kurz an,
dass der korrekt ist,
also da kann man jetzt mit einer schleifenden Variante ganz gut arbeiten,
das wollen wir uns einmal ganz kurz angucken und den Übergang zu dem kürzesten Pfad von Dyxtra wollen wir noch mal kurz machen.
Genau, und dann, wenn wir gucken, dann klingen wir aus.
Aber erst mal bis 11 Uhr Pause,
Pause 11 Uhr, Pause bis 11
bis gleich