|
1 | 1 | package graph;
|
2 | 2 |
|
3 | 3 | import java.util.Comparator;
|
| 4 | +import java.util.StringJoiner; |
4 | 5 | import list.DummyDoublyLinkedList;
|
5 | 6 | import list.List;
|
6 | 7 | import priorityqueue.HeapPriorityQueue;
|
7 | 8 | import priorityqueue.PriorityQueue;
|
| 9 | +import queue.LinkedListQueue; |
| 10 | +import queue.Queue; |
| 11 | +import stack.ListStack; |
| 12 | +import stack.Stack; |
8 | 13 |
|
9 | 14 | public class ListWeightGraph implements WeightedGraph {
|
10 | 15 |
|
@@ -49,17 +54,83 @@ public void addEdge(Enum<?> fromV, Enum<?> toV) {
|
49 | 54 |
|
50 | 55 | @Override
|
51 | 56 | public String showGraphEdgeInfo() {
|
52 |
| - return null; |
| 57 | + StringBuilder sb = new StringBuilder(); |
| 58 | + |
| 59 | + for (List<Enum<?>> vertex : vertices) { |
| 60 | + if (vertex.size() > 1) { |
| 61 | + for (int i = 0; i < vertex.size(); i++) { |
| 62 | + sb.append(vertex.get(i)); |
| 63 | + if (i == 0) { |
| 64 | + sb.append(": "); |
| 65 | + } else if (i < vertex.size() - 1) { |
| 66 | + sb.append(" "); |
| 67 | + } |
| 68 | + } |
| 69 | + sb.append("\n"); |
| 70 | + } |
| 71 | + } |
| 72 | + |
| 73 | + return sb.toString(); |
53 | 74 | }
|
54 | 75 |
|
55 | 76 | @Override
|
56 | 77 | public String depthFirstSearch(Enum<?> startV) {
|
57 |
| - return null; |
| 78 | + boolean[] visited = new boolean[vertices.length]; |
| 79 | + StringJoiner sj = new StringJoiner(" "); |
| 80 | + Stack<Enum<?>> vertexStack = new ListStack<>(); |
| 81 | + vertexStack.push(startV); |
| 82 | + |
| 83 | + while (!vertexStack.isEmpty()) { |
| 84 | + Enum<?> visitV = vertexStack.pop(); |
| 85 | + |
| 86 | + if (visitVertex(visited, visitV)) { |
| 87 | + sj.add(visitV.toString()); |
| 88 | + } |
| 89 | + List<Enum<?>> vertexList = vertices[visitV.ordinal()]; |
| 90 | + for (int i = 0; i < vertexList.size(); i++) { |
| 91 | + Enum<?> vertex = vertexList.get(i); |
| 92 | + if (!visited[vertex.ordinal()]) { |
| 93 | + vertexStack.push(vertex); |
| 94 | + } |
| 95 | + } |
| 96 | + } |
| 97 | + |
| 98 | + return sj.toString(); |
58 | 99 | }
|
59 | 100 |
|
60 | 101 | @Override
|
61 | 102 | public String breadthFirstSearch(Enum<?> startV) {
|
62 |
| - return null; |
| 103 | + boolean[] visited = new boolean[vertices.length]; |
| 104 | + StringJoiner sj = new StringJoiner(" "); |
| 105 | + Queue<Enum<?>> vertexQueue = new LinkedListQueue<>(); |
| 106 | + vertexQueue.enqueue(startV); |
| 107 | + |
| 108 | + while (!vertexQueue.isEmpty()) { |
| 109 | + Enum<?> visitV = vertexQueue.dequeue(); |
| 110 | + |
| 111 | + if (visitVertex(visited, visitV)) { |
| 112 | + sj.add(visitV.toString()); |
| 113 | + } |
| 114 | + |
| 115 | + List<Enum<?>> vertexList = vertices[visitV.ordinal()]; |
| 116 | + for (int i = 0; i < vertexList.size(); i++) { |
| 117 | + Enum<?> vertex = vertexList.get(i); |
| 118 | + if (!visited[vertex.ordinal()]) { |
| 119 | + vertexQueue.enqueue(vertex); |
| 120 | + } |
| 121 | + } |
| 122 | + |
| 123 | + } |
| 124 | + |
| 125 | + return sj.toString(); |
| 126 | + } |
| 127 | + |
| 128 | + private boolean visitVertex(boolean[] visited, Enum<?> vertex) { |
| 129 | + if (visited[vertex.ordinal()]) { |
| 130 | + return false; |
| 131 | + } |
| 132 | + visited[vertex.ordinal()] = true; |
| 133 | + return true; |
63 | 134 | }
|
64 | 135 |
|
65 | 136 | private static class WeightEdge {
|
|
0 commit comments