forked from realpacific/algorithms
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGraph.kt
126 lines (106 loc) · 3.33 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
114
115
116
117
118
119
120
121
122
123
124
125
126
package algorithmdesignmanualbook.graph
class Graph(private val isDirected: Boolean) {
val vertices = mutableMapOf<String, Vertex>()
fun isIn(value: String): Boolean {
return vertices.containsKey(value)
}
fun getRandomVertex(): Vertex {
return vertices[vertices.keys.elementAt(0)]!!
}
fun getVertex(str: String): Vertex {
return vertices[str]!!
}
fun isConnected(v1: String, v2: String): Boolean {
return (vertices[v1] ?: return false).isConnectTo(vertices[v2] ?: return false)
}
fun addVertex(value: String): Vertex {
require(!vertices.containsKey(value))
vertices[value] = Vertex(value)
return vertices[value]!!
}
fun join(v1: Vertex, v2: Vertex, weight: Int = 0) {
v1.addEdge(v2, weight)
if (!isDirected) {
v2.addEdge(v1, weight)
}
}
fun join(value1: String, value2: String, weight: Int = 0) {
val v1 = vertices[value1]
val v2 = vertices[value2]
requireNotNull(v1)
requireNotNull(v2)
join(v1, v2, weight)
}
override fun toString(): String {
return "Graph(${vertices.values})"
}
data class Vertex(val value: String) {
var edges = mutableSetOf<Edge>()
var state = State.UNDISCOVERED
fun isConnectTo(v2: Vertex): Boolean {
val edge = Edge(this, v2)
return edges.contains(edge)
}
fun addEdge(vertex: Vertex, weight: Int = 0) {
val edge = Edge(this, vertex)
edge.weight = weight
this.edges.add(edge)
}
override fun toString(): String {
return "Vertex(value=$value, edges=${edges})"
}
}
enum class State {
DISCOVERED, UNDISCOVERED, PROCESSED
}
data class Edge(val startVertex: Vertex, val endVertex: Vertex) {
var weight: Int = 0
override fun toString(): String {
return "Edge(${startVertex.value} ${endVertex.value}, weight=$weight)"
}
}
companion object {
fun getDefaultDirected(): Graph {
val graph = Graph(true)
val v1 = graph.addVertex("1")
val v2 = graph.addVertex("2")
val v3 = graph.addVertex("3")
val v4 = graph.addVertex("4")
val v5 = graph.addVertex("5")
val v6 = graph.addVertex("6")
val v7 = graph.addVertex("7")
graph.join(v2, v3)
graph.join(v1, v2)
graph.join(v1, v3)
graph.join(v1, v5)
graph.join(v5, v4)
graph.join(v3, v6)
graph.join(v4, v7)
return graph
}
/**
* 2---3
* / | |
* 1 | 4
* |\ |---/
* 6 5
*
*/
fun getDefaultUnDirected(): Graph {
val graph = Graph(false)
val v1 = graph.addVertex("1")
val v2 = graph.addVertex("2")
val v3 = graph.addVertex("3")
val v4 = graph.addVertex("4")
val v5 = graph.addVertex("5")
val v6 = graph.addVertex("6")
graph.join(v1, v2)
graph.join(v2, v3)
graph.join(v3, v4)
graph.join(v4, v5)
graph.join(v5, v1)
graph.join(v1, v6)
return graph
}
}
}