Es gibt zwei Seiten - Quelleseite und Senkeseite mit Verteileren.
zuerst wird der entsprechende neue “Schnitt” berechnet.
in jedem rekursionsabstieg wird von der Senkeseite ein Verteiler zur Quellseite hinzugefügt.
//dabei wird sichergestellt, dass man nicht die Senke hinzufügt, denn die ist ja das Ziel, außerdem wird sichergestellt, dass wir keine Knoten doppelt auf der Quellseite erfassen.
da wir alle Möglichkeiten durchprobieren müssen wird hier eine Form des Backtracking angewandt, sodass bei aufstieg aus der Rekursion der zuletzt hinzugefügte Verteiler wieder gelöscht wird, davor wird noch der Schnitt aktualisiert, da aus den tiefen der Rekursion ein neuer Schnitt kommt der eventuell besser ist.
Die kommen erst NACH dem rekursiven Aufruf. Habe es eben ausprobiert, ohne diese zwei Zeilen kommt das gleiche raus wie mit.
Ich verstehe nicht, was die bewirken sollen.
Das soll schon Math.min sein, ich habe bloß die Aufgabenstellung falsch verstanden. Die Zeile mit dem Array braucht man imo. nicht, die Methode funktioniert auch so. Ich bin bloß beim Arbeiten mit Listen auf eine die Concurrent Modification Exception gestoßen, weshalb ich zunächst vorgezogen habe, mit Arrays zu arbeiten. So soll es aber auch funktionieren:
Die zwei Zeilen dienen zur Rücksetzung des alten Zustands. Von daher würde ich sie nicht weglassen. Teste doch mal deine Methode mit Math.max statt Math.min ohne die Zeilen
senkeSeite.add(v);
quelleSeite.remove(v);
und dann mit (aber ersetze dabei die Zeile “for(Verteiler v : senkeSeite)” durch “for(Verteiler v : ssa)”) und du siehst mit den Zeilen das Ergebnis 12 (was auch richtig wäre) und ohne das Ergebnis 9.
Wäre toll, wenn dir so ein Spezialfall einfällt, dann könnte ich es vielleicht sogar verstehen=) Ist aber nicht so wichtig.
Ich will dich auch nicht vom Klausur lernen abhalten, wenn du da noch anderes zu tun hast.
Ich habe aber noch weitere Fragen:
Bei der Aufgabe2, der Schreibtischlauf:
Gleich am Anfang:
Warum kommt hier „ist unverdaulich raus?“
Ich hätte „dauert mehrere Stunden“ gewählt. Das wird ja einfach mit ner 1 aufgerufen, da hätte ich gedacht dass das eher in den Integer fällt und nicht in Long.
Angeblich kommt 42 raus. OK, das hat wohl wieder mit dem statischen Typ oder so zu tun. menge ist bei MilchShake statisch, und der statische Typ ist hier Trinkbar
und bei Trinkbar ist Menge gleich 42 und dahere wird das ausgegeben, war das richtig?
Danke.
Gilt diese Regel immer?
Ich dachte bislang, dass man halt schaut, ob die methode oder das attribut um das es geht, mit „static“ deklariert ist. Wenn das der Fall ist,
dann schaut man was der statische Typ, in diesem Fall Trinkbar, dort eingetragen hat.
Da bringst du grade Sachen durcheinander. Das Keyword [m]static[/m] hat nichts mit statischem Typ zu tun.
Kurz gesagt bedeutet [m]static[/m] bei Methoden, dass diese auch ohne ein existierendes Objekt der Klasse aufgerufen werden koennen (bspw. [m]Integer.parseInt(String s)[/m]) und bei Attributen, dass diese existieren, auch wenn zur Zeit kein Objekt der Klasse existiert.
Danke Chayyam für deinen Spezialfall. Ich habe das gestern schon gelesen,
ABER JETZT HAB ICH S ERST VERSTANDEN ! JUHU! Puuh, die Aufgabe hat mir echt Kopfzerbrechen bereitet.
Die Regel ist übrigens das, was die “Typsicherheit” besagt.
Typsicherheit: Es dürfen nur Methoden aufgerufen werden,
die schon beim statischen Typ von m (Oberklasse Medium) verfügbar sind.
[aus Vorlesungsfolien]