@@ -40,7 +40,12 @@ object Graphs {
40
40
val visited = mutableSetOf<V >()
41
41
vertices.forEach { vertex -> dist[vertex] = Double .POSITIVE_INFINITY }
42
42
dist[start] = 0.0
43
- val queue = PriorityQueue { l: V , r: V -> compareDoubles(dist.getOrDefault(l, Double .MAX_VALUE ), dist.getOrDefault(r, Double .MAX_VALUE )) }
43
+ val queue = PriorityQueue { l: V , r: V ->
44
+ compareDoubles(
45
+ dist.getOrDefault(l, Double .MAX_VALUE ),
46
+ dist.getOrDefault(r, Double .MAX_VALUE )
47
+ )
48
+ }
44
49
queue.add(start)
45
50
while (queue.isNotEmpty()) {
46
51
val vertex = queue.poll()
@@ -77,11 +82,19 @@ object Graphs {
77
82
}
78
83
79
84
fun <V > dfs (start : V , end : V , neighbors : (V ) -> List <V >): List <V > {
80
- return search(start, end, neighbors) { list, element -> list.add( 0 , element ) }
85
+ return search(start, end, neighbors) { addFirst(it ) }
81
86
}
82
87
83
88
fun <V > bfs (start : V , end : V , neighbors : (V ) -> List <V >): List <V > {
84
- return search(start, end, neighbors) { list, element -> list.add(element) }
89
+ return search(start, end, neighbors) { addLast(it) }
90
+ }
91
+
92
+ fun <V > dfsTraversal (start : V , neighbors : (V ) -> List <V >): List <V > {
93
+ return traverse(start, neighbors) { addFirst(it) }
94
+ }
95
+
96
+ fun <V > bfsTraversal (start : V , neighbors : (V ) -> List <V >): List <V > {
97
+ return traverse(start, neighbors) { addLast(it) }
85
98
}
86
99
87
100
fun <V > allPaths (start : V , end : V , neighbors : (V ) -> List <V >): List <List <V >> {
@@ -101,7 +114,7 @@ object Graphs {
101
114
return paths
102
115
}
103
116
104
- fun <V > connectedComponents (vertices : Set <V >, neighbors : (V ) -> List <V >): List <Set <V >> {
117
+ fun <V > connectedComponents (vertices : Set <V >, neighbors : (V ) -> List <V >): List <Set <V >> {
105
118
val components = mutableListOf<Set <V >>()
106
119
val visited = mutableSetOf<V >()
107
120
vertices.forEach { vertex ->
@@ -114,17 +127,34 @@ object Graphs {
114
127
return components
115
128
}
116
129
130
+ private fun <V > traverse (
131
+ start : V ,
132
+ neighbors : (V ) -> List <V >,
133
+ append : MutableList <V >.(V ) -> Unit
134
+ ): List <V > {
135
+ val visited = mutableSetOf (start)
136
+ val vertices = mutableListOf (start)
137
+ val traversal = mutableListOf<V >()
138
+ while (vertices.isNotEmpty()) {
139
+ val vertex = vertices.removeFirst()
140
+ traversal.add(vertex)
141
+ neighbors(vertex).filter { it !in visited }.forEach { neighbor ->
142
+ visited + = neighbor
143
+ vertices.append(neighbor)
144
+ }
145
+ }
146
+ return traversal
147
+ }
148
+
117
149
private fun <V > search (
118
150
start : V ,
119
151
end : V ,
120
152
neighbors : (V ) -> List <V >,
121
- add : ( MutableList <List <V >>, List <V >) -> Unit
153
+ append : MutableList <List <V >>.( List <V >) -> Unit
122
154
): List <V > {
123
155
val visited = mutableSetOf<V >()
124
156
visited + = start
125
- val paths = mutableListOf<List <V >>()
126
- add(paths, listOf (start))
127
-
157
+ val paths = mutableListOf (listOf (start))
128
158
while (paths.isNotEmpty()) {
129
159
val path = paths.removeFirst()
130
160
val terminus = path.last()
@@ -133,7 +163,7 @@ object Graphs {
133
163
}
134
164
neighbors(terminus).filter { it !in visited }.forEach { neighbor ->
135
165
visited + = neighbor
136
- add( paths, path + neighbor)
166
+ paths.append( path + neighbor)
137
167
}
138
168
}
139
169
return listOf ()
0 commit comments