-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGraph.kt
113 lines (100 loc) · 2.85 KB
/
Graph.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
package structures
import java.util.LinkedList
/**
* data structure: graph
*
* description: a graph is made up of vertices connected by edges
*
*/
class Graph<T> {
private val data = mutableMapOf<Vertex<T>, MutableList<Vertex<T>>>()
/**
* adds a new vertex
*
* @param value - the value of the new vertex
*/
fun addVertex(value: T) = data.putIfAbsent(Vertex(value), mutableListOf())
/**
* removes a vertex from a graph
*
* @param value - vertex value
*/
fun removeVertex(value: T) {
val removingVertex = Vertex(value)
data.values.forEach { list ->
list.remove(removingVertex)
}
data.remove(removingVertex)
}
/**
* adds an edge between two vertices
*
* @param value1 - first vertex value
* @param value2 - second vertex value
*/
fun addEdge(value1: T, value2: T) {
val vertex1 = Vertex(value1)
val vertex2 = Vertex(value2)
data[vertex1]?.add(vertex2)
data[vertex2]?.add(vertex1)
}
/**
* removes an edge between two vertices
*
* @param value1 - first vertex value
* @param value2 - second vertex value
*/
fun removeEdge(value1: T, value2: T) {
val vertex1 = Vertex(value1)
val vertex2 = Vertex(value2)
data[vertex1]?.remove(vertex2)
data[vertex2]?.remove(vertex1)
}
/**
* returns the associated vertices with the given vertex
*
* @param value - vertex value
*/
fun connectedVertexes(value: T) = data[Vertex(value)] ?: listOf()
/**
* traversal of the graph in depth
*
* @return returns all vertices of the graph
*/
fun depthFirstTraversal() : List<Vertex<T>> {
val visited = LinkedHashSet<Vertex<T>>()
val queue = LinkedList<Vertex<T>>()
queue.push(data.keys.first())
while (queue.isNotEmpty()) {
val vertex = queue.pop()
if (!visited.contains(vertex)) {
visited.add(vertex)
queue.addAll(data[vertex] ?: listOf())
}
}
return visited.toList()
}
/**
* traversal of the graph in breadth
*
* @return returns all vertices of the graph
*/
fun breadthFirstTraversal() : List<Vertex<T>> {
val visited = LinkedHashSet<Vertex<T>>()
val queue = LinkedList<Vertex<T>>()
val firstVertex = data.keys.firstOrNull() ?: return listOf()
queue.add(firstVertex)
visited.add(firstVertex)
while (queue.isNotEmpty()) {
val vertex = queue.poll()
data[vertex]?.forEach { v ->
if (!visited.contains(v)) {
visited.add(v)
queue.add(v)
}
}
}
return visited.toList()
}
}
data class Vertex<T>(val value: T)