package algorithmen; import java.util.List; import java.util.Collections; import java.nio.file.*; import graph.*; /** * Dieser Algorithmus findet eine topologische Sortierung des Graphen. * * @version 7.1 from 12.02.2025 * @author Thomas Schaller */ public class GraphAlgo_toplogischeSortierung extends GraphAlgo { // Anfang Attribute public String getBezeichnung() { return "Topologische Sortierung"; } // Anfang Methoden public void fuehreAlgorithmusAus() throws InterruptedException { String reihenfolge = ""; if (g.getAnzahlKnoten()==0) { return; } info("Bestimme die Anzahl der eingehenden Kanten für jeden Knoten"); infoIndentMore(); List knoten = g.getAlleKnoten(); for(Knoten k: knoten) { k.setWert(g.getEingehendeKanten(k).size()); info("Setze Wert von von "+g.getKnoteninfo(k, false)+" auf "+g.getEingehendeKanten(k).size()); } infoIndentLess(); step(); while(knoten.size()>0) { Collections.sort(knoten); info("Sortiere die noch nicht markierten Knoten nach ihrem Wert"); Knoten k = knoten.get(0); k.setMarkiert(true); info("Nimm Knoten mit dem geringsten Wert: "+g.getKnoteninfo(k,false)+" und markiere ihn."); if(k.getIntWert() != 0) { melde("Fehler: Wert ist nicht 0 - Zyklus vorhanden - Keine topologische Sortierung möglich"); knoten.clear(); return; } else { reihenfolge += " "+g.getKnoteninfo(k, false); info("Füge ihn der Liste hinzu: "+reihenfolge); knoten.remove(k); info("Reduziere den Wert aller Nachbarn von "+g.getKnoteninfo(k,false)+" um 1"); infoIndentMore(); for(Knoten k2 : g.getNachbarknoten(k)) { k2.setWert(k2.getIntWert()-1); info("Setze "+g.getKnoteninfo(k2, false)+" auf "+k2.getIntWert()); } infoIndentLess(); } step(); } melde("Topologische Sortierung: "+reihenfolge); } // end // Ende Methoden }