Ich kam zu einem Problem, als ich versuchte, mit Graphen zu arbeiten und etwas Code dafür zu schreiben, aber ohne Glück: / !!
Ich wollte etwas erstellen, das die Daten des Graphen aufnimmt und prüft, ob es 1- verbunden 2-teilig 3- hat Zyklus 4- ist ein Baum
Ich frage mich zum Beispiel, ob dies geschrieben werden kann, um eine Graphik aus einer .txt-Datei zu lesen, die die obigen Tests durchführt?
mit einfachen Kanten-Liste-Format ist der richtige Ansatz dafür?
Ihre Hilfe wird geschätzt, wenn Sie mir einen Link geben können, um zu erfahren, wie Sie diese Aufgabe erledigen oder einen Kick-Start für einen Code bekommen !!
danke: D
überprüfe, ob es ist:
- verbunden
Bei diesem Versuch versuchst du, den gesamten Graph von einem Punkt aus zu durchlaufen und zu sehen, ob du erfolgreich bist. Sowohl die Tiefen-zuerst-Traversierung als auch die Breiten-zuerst-Traversierung sind hier akzeptabel. Dieser Algorithmus teilt den Knoten in Komponenten auf:
c
, wenn dieser Knoten nicht besucht wurde
t
in der Warteschlange steht
Wenn es nur eine Komponente gibt, ist das Diagramm verbunden.
Wenn eine Warteschlange verwendet wird, ist der Algorithmus eine Suche nach der Breite. Wenn ein Stapel verwendet wird, ist der Algorithmus eine Tiefensuche. Jede andere Sammlung mit den Push-und Pop-Any-Operationen tun. Von besonderem Interesse ist der Call-Stack: Ersetze "Enqueue for Traversal" durch "traverse rekursiv"
Für gerichtete Graphen gibt es zwei verwandte Konzepte: Ein gerichteter Graph ist schwach verbunden, wenn er unter Vernachlässigung aller Kantenrichtungen verbunden ist. Ein gerichteter Graph ist stark verbunden, wenn jeder Knoten von jedem Knoten aus erreichbar ist. Um auf starke Verbundenheit zu prüfen, genügt es zu überprüfen, dass jeder Knoten vom ersten Knoten aus nur mit Vorwärtsflanken erreichbar ist und jeder Knoten vom ersten Knoten aus nur mit Rückwärtsflanken erreichbar ist (der erste Knoten ist von jedem Knoten erreichbar).
- zweigliedrig
Ein Graph ist zweigeteilt, wenn er zweifarbig ist. Versuchen Sie, eine Zweifarbigkeit zuzuweisen, und wenn Sie scheitern, ist die Grafik nicht zweigeteilt. Dies kann in den vorherigen Algorithmus integriert werden: Wenn Sie einen Knoten als offen markieren, weisen Sie ihm eine Farbe zu, die der Farbe des Nachbars t
entspricht. Wenn ein Nachbar von t
bereits geöffnet ist, überprüfen Sie seine Farbe. Wenn die Farbe dieselbe ist wie die von t
, gibt es keine Zweifarbigkeit.
- hat einen Zyklus
Dies ist einfach: Wenn Sie any Knoten beobachten, der bereits geöffnet ist, gibt es einen Zyklus. Beachten Sie, dass jeder Graph, der keinen Zyklus hat, zweigeteilt ist.
In gerichteten Graphen wird dies das Vorhandensein eines ungerichteten Zyklus erkennen. Verwenden Sie den folgenden (topologischen Sortier) Algorithmus, um das Vorhandensein von gerichteten Zyklen zu erkennen:
- Baum
Ein ungerichtetes Diagramm ist ein Baum, wenn es verbunden ist und keinen Zyklus enthält.
Ein gerichteter Graph ist ein gerooteter Baum, wenn er keine ungerichteten Zyklen hat und es nur einen Knoten mit einem Nullwert (nur eine Wurzel) gibt. Ein gerichteter Graph ist auch ein gerooteter Baum, wenn er verbunden ist, hat keine ungerichteten Zyklen und jeder Knoten mit einem Nullgrad von Null hat einen Wert von höchstens eins (jede Senke ist ein Blatt).