Topologisches Sortieren nach Präferenzen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Topologisches Sortieren nach Präferenzen

    Quellcode

    1. import java.util.*;
    2. import fhw.ADSTool;
    3. /**
    4. * A1: Topologisches Sortieren
    5. * @author Torben Brodt & Marco May
    6. *
    7. */
    8. public class A1 {
    9. enum Status {start, stop};
    10. /**
    11. * Mainmethode
    12. * @param args-Kommandozeilenparameter
    13. */
    14. public static void main(String[] args) {
    15. Graph g = new Graph();
    16. String[] zahlen = ADSTool.readStringArray(args.length == 0 ? "u12a1simple.dat" : args[0]);
    17. for (int i = 0; i < zahlen.length - 1; i += 2) {
    18. if (!g.containsNode(zahlen[i]))
    19. g.addNode(zahlen[i]);
    20. if (!g.containsNode(zahlen[i + 1]))
    21. g.addNode(zahlen[i + 1]);
    22. if (!g.containsEdge(zahlen[i], zahlen[i + 1]))
    23. g.addEdge(zahlen[i], zahlen[i + 1]);
    24. }
    25. //g.show();
    26. List<String> llist = new LinkedList<String>();
    27. if (acyclic(g, llist)){ //Graph ist nicht zyklisch und f�llt Liste
    28. if (check(zahlen, llist)) { //wenn Liste identisch mit Vorgabe
    29. for (ListIterator it = llist.listIterator(); it.hasNext();)
    30. System.out.print(it.next()+" < ");
    31. }
    32. }
    33. else //Graph ist zyklisch
    34. System.out.println("Zyklus");
    35. }
    36. /**
    37. * Test den Graphen auf einen Zyklus (aus der Vorlesung)
    38. * @param g -Der Graph
    39. * @param llist-Liste
    40. */
    41. static boolean acyclic(Graph g, List<String> llist) {
    42. Map<String, Status> visited = new TreeMap<String, Status>();
    43. for (Iterator<String> it = g.nodeIterator(); it.hasNext();) {
    44. String n = it.next();
    45. if (!visited.containsKey(n))
    46. if (!acyclicRek(g, n, visited, llist))
    47. return false;
    48. }
    49. return true;
    50. }
    51. /**
    52. * Prueft ob unsere Liste richtig ist
    53. * @param objects - Zu pruefende Objekte
    54. * @param llist -Liste, die wir erstellt haben
    55. * @return true, gdw. Check erfolgreich war
    56. */
    57. static boolean check(String[] objects, List<String> llist) {
    58. for(int i=0; i<objects.length-1; i+=2) {
    59. String left = objects[i];
    60. String right = objects[i+1];
    61. boolean oK = false;
    62. boolean leftNumberFound = false; //Bevor man die Liste durchgeht
    63. //9 & 2 sollen gefunden werden
    64. for (ListIterator<String> it = llist.listIterator(); it.hasNext();){
    65. String suche = it.next();
    66. if(suche.equals(left)) {
    67. //Suche erst nach der linken Zahl
    68. //9 gefunden. Suche rechts davon nach 2
    69. leftNumberFound = true; //Linke Zahl gefunden
    70. }
    71. if(leftNumberFound == true && suche.equals(right)) {
    72. // Wenn die linke Zahl schon gefunden wurde,
    73. // dann suche nach der rechten Zahl
    74. // 2 rechts davon gefunden - alles i.O.
    75. oK = true; // In diesem Durchlauf ist also alles OK
    76. break;
    77. }
    78. }
    79. if(oK == false)
    80. return false;
    81. }
    82. return true;
    83. }
    84. /**
    85. * Rekursive Hilfsfunktion fuer acyclic()
    86. * @param g - zu pruefender Graph
    87. * @param node -aktueller Knoten
    88. * @param visited -Besuchte Objekte
    89. * @param llist -Liste der Zahlen
    90. * @return true, gdw. Rek. erfolgreich
    91. */
    92. @SuppressWarnings("unchecked")
    93. static boolean acyclicRek(Graph g, String node, Map<String, Status> visited, List<String> llist) {
    94. visited.put(node, Status.start); // Start Knoten expandieren
    95. for (Iterator<String> it = g.edgeIterator(node); it.hasNext();) {
    96. String expanded = it.next();
    97. if (visited.containsKey(expanded)) {
    98. if (visited.get(expanded).equals(Status.start)) // Back-Edge,
    99. // Zyklus
    100. return false; // else Cross-Edge, ok
    101. } else { // !visited.containsKey(expanded)
    102. visited.put(expanded, Status.start);
    103. if (!acyclicRek(g, expanded, visited, llist)) // rekursiv Zyklus
    104. // erkannt
    105. return false;
    106. }
    107. }
    108. visited.put(node, Status.stop); // Stop Knoten expandieren
    109. llist.add(0,node);
    110. return true;
    111. }
    112. }
    Alles anzeigen
    Dateien
    • GraphException.java

      (297 Byte, 296 mal heruntergeladen, zuletzt: )
    • Graph.java

      (6,81 kB, 415 mal heruntergeladen, zuletzt: )