4019 Ggraphzu Gerichteten Graphen auf Zusammenhang testen
Kategorie:Graphen
Klasse:mittel
Eingabe:siehe Spez.
Ausgabe:siehe Spez.
Abzugebende Files: Ggraphzu.txt, Main.java, Ggraphzu/*.java , 1288.txt, 1813.txt

Kurzbeschreibung:

Ein gerichteter Graph wird auf seinen Zusammenhang geprüft.

Allgemeine Hinweise:

Aufgabenstellung:

Ein Graph ist eine Menge von "Knoten" die durch "Kanten" teilweise miteinander verbunden sind. Bei einem gerichteten Graphen ist den Kanten zwischen je zwei Knoten eine Richtung zugeordnet.
(etwa A -> B anstelle von A <-> B).

Überprüfen Sie einen solchen gerichteten Graphen auf seinen Zusammenhang.

Lesen Sie solange Strings ein, bis die Eingabe durch den String "0" abgeschlossen wird. Die Strings dürfen dabei nur aus Buchstaben bestehen.

Jeder String soll einen Knoten eines gerichteten Graphen darstellen, wobei das erste Zeichen des Strings den Knoten selbst bezeichnet, die darauffolgenden Zeichen sollen Knoten spezifizieren, zu denen eine gerichtete Verbindung besteht.

Testen Sie, ob der so eingegebene Graph ein zusammenhängender Graph ist (von jedem Knoten führt mindestens ein Weg zu jedem anderen Knoten).

Bauen Sie mit den eingelesenen Daten eine "Adjazenzliste" auf:

In der ersten Zeile befinden sich alle Knoten des Graphen. Darunter sind alle benachbarten Knoten angeführt, zu denen eine Kante weist.

Für die Überprüfung schreiben Sie eine am besten eine rekursive Prozedur, die ausgehend von einem Knoten einen Weg (über einen oder mehrere andere Knoten) sucht.
(Achtung: Bereits besuchte Knoten sind zu markieren, da sonst die Gefahr einer endlosen Rekursion besteht!)
Tip: Wenn ausgehend von einem Knoten alle möglichen Wege (bis es keine Fortsetzung mehr gibt) rekursiv durchlaufen werden und danach festgestellt wird, daß alle anderen Knoten bereits besucht wurden, so gibt es zwangsläufig einen Weg zu jedem anderen Knoten.
(Achtung: Wenn ein Weg von A nach B existiert, muß deshalb noch kein Weg von B nach A führen (gerichteter Graph!)).

Eingabedaten:

Lesen Sie solange Strings ein, bis eine einzelne Null ("0") aufscheint, diese kennzeichnet das Ende der Eingabe. Die Eingabe darf nur aus Klein- und Großbuchstaben bestehen, wobei Kleinbuchstaben in Großbuchstaben umgewandelt werden sollen.

Die Reihenfolge der eingegebenen Knoten und deren Verbindungen muß nicht geordnet sein (d.h. "B" muß nicht unbedingt nach "A" folgen).
Wenn von einem Knoten keine Kanten wegführen, muß er trotzdem als einzelner Buchstabe angeführt werden.
Es darf im Alphabet kein "Loch" entstehen, d.h. wenn es einen Knoten "C" gibt, dann muß es auch einen Knoten "B" geben.
Jeder Knoten darf nur einmal in der Eingabe als Ausgangsknoten auftreten.

Ausgabedaten:

Bei korrekten Eingabedaten soll Ihr Programm im Falle eines zusammenhängenden Graphen "JA", im Falle eines nicht zusammenhängenden Graphen "NEIN", gefolgt von einem Zeilenvorschub, ausgeben.

Fehlerbehandlung:

Genügen die eingelesenen Daten nicht den Vorgaben, dann soll Ihr Programm die Meldung "FALSCHE EINGABE", gefolgt von einem Zeilenvorschub, ausgeben.

Beispiele:

Eingabedaten
ABD ACB BCD DB 0

ABD BC CB DA 0

ABD BCD CB DA 0

Ausgabedaten
FALSCHE EINGABE

NEIN

JA


Testen:

Diese Beispiele dienen nur zur Verdeutlichung der Spezifikation und müssen nicht korrekt formatiert sein. Die korrekte Formatierung entnehmen Sie bitte dem mitgelieferten Outputfile. Zum Testen Ihrer Lösung können Sie aus den mitgelieferten Eingabedaten wie folgt eine Ausgabedatei erzeugen:

java Main < Ggraphzu.i1 > Ggraphzu.out1

Das erzeugte File Ggraphzu.out1 können Sie dann mit dem mitgelieferten Outputfile Ggraphzu.o1 vergleichen.