2024-03-03 19:18:07 +08:00
|
|
|
|
/**
|
|
|
|
|
* File: graph_adjacency_list.kt
|
|
|
|
|
* Created Time: 2024-01-25
|
|
|
|
|
* Author: curtishd (1023632660@qq.com)
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
package chapter_graph
|
|
|
|
|
|
|
|
|
|
import utils.Vertex
|
|
|
|
|
|
|
|
|
|
/* 基于邻接表实现的无向图类 */
|
|
|
|
|
class GraphAdjList(edges: Array<Array<Vertex?>>) {
|
|
|
|
|
// 邻接表,key:顶点,value:该顶点的所有邻接顶点
|
2024-04-07 18:56:59 +08:00
|
|
|
|
val adjList = HashMap<Vertex, MutableList<Vertex>>()
|
2024-03-03 19:18:07 +08:00
|
|
|
|
|
2024-04-07 18:56:59 +08:00
|
|
|
|
/* 构造方法 */
|
2024-03-03 19:18:07 +08:00
|
|
|
|
init {
|
|
|
|
|
// 添加所有顶点和边
|
|
|
|
|
for (edge in edges) {
|
2024-04-13 20:09:39 +08:00
|
|
|
|
addVertex(edge[0]!!)
|
|
|
|
|
addVertex(edge[1]!!)
|
|
|
|
|
addEdge(edge[0]!!, edge[1]!!)
|
2024-03-03 19:18:07 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* 获取顶点数量 */
|
|
|
|
|
fun size(): Int {
|
|
|
|
|
return adjList.size
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* 添加边 */
|
|
|
|
|
fun addEdge(vet1: Vertex, vet2: Vertex) {
|
|
|
|
|
if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)
|
|
|
|
|
throw IllegalArgumentException()
|
|
|
|
|
// 添加边 vet1 - vet2
|
|
|
|
|
adjList[vet1]?.add(vet2)
|
2024-04-13 20:09:39 +08:00
|
|
|
|
adjList[vet2]?.add(vet1)
|
2024-03-03 19:18:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* 删除边 */
|
|
|
|
|
fun removeEdge(vet1: Vertex, vet2: Vertex) {
|
|
|
|
|
if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)
|
|
|
|
|
throw IllegalArgumentException()
|
|
|
|
|
// 删除边 vet1 - vet2
|
2024-04-13 20:09:39 +08:00
|
|
|
|
adjList[vet1]?.remove(vet2)
|
|
|
|
|
adjList[vet2]?.remove(vet1)
|
2024-03-03 19:18:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* 添加顶点 */
|
|
|
|
|
fun addVertex(vet: Vertex) {
|
|
|
|
|
if (adjList.containsKey(vet))
|
|
|
|
|
return
|
|
|
|
|
// 在邻接表中添加一个新链表
|
|
|
|
|
adjList[vet] = mutableListOf()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* 删除顶点 */
|
|
|
|
|
fun removeVertex(vet: Vertex) {
|
|
|
|
|
if (!adjList.containsKey(vet))
|
|
|
|
|
throw IllegalArgumentException()
|
|
|
|
|
// 在邻接表中删除顶点 vet 对应的链表
|
2024-04-13 20:09:39 +08:00
|
|
|
|
adjList.remove(vet)
|
2024-03-03 19:18:07 +08:00
|
|
|
|
// 遍历其他顶点的链表,删除所有包含 vet 的边
|
|
|
|
|
for (list in adjList.values) {
|
|
|
|
|
list.remove(vet)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* 打印邻接表 */
|
|
|
|
|
fun print() {
|
|
|
|
|
println("邻接表 =")
|
|
|
|
|
for (pair in adjList.entries) {
|
2024-04-07 18:56:59 +08:00
|
|
|
|
val tmp = mutableListOf<Int>()
|
2024-03-03 19:18:07 +08:00
|
|
|
|
for (vertex in pair.value) {
|
2024-04-10 18:09:43 +08:00
|
|
|
|
tmp.add(vertex._val)
|
2024-03-03 19:18:07 +08:00
|
|
|
|
}
|
2024-04-10 18:09:43 +08:00
|
|
|
|
println("${pair.key._val}: $tmp,")
|
2024-03-03 19:18:07 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Driver Code */
|
|
|
|
|
fun main() {
|
|
|
|
|
/* 初始化无向图 */
|
2024-04-07 18:56:59 +08:00
|
|
|
|
val v = Vertex.valsToVets(intArrayOf(1, 3, 2, 5, 4))
|
2024-03-03 19:18:07 +08:00
|
|
|
|
val edges = arrayOf(
|
|
|
|
|
arrayOf(v[0], v[1]),
|
|
|
|
|
arrayOf(v[0], v[3]),
|
|
|
|
|
arrayOf(v[1], v[2]),
|
|
|
|
|
arrayOf(v[2], v[3]),
|
|
|
|
|
arrayOf(v[2], v[4]),
|
|
|
|
|
arrayOf(v[3], v[4])
|
|
|
|
|
)
|
|
|
|
|
val graph = GraphAdjList(edges)
|
|
|
|
|
println("\n初始化后,图为")
|
|
|
|
|
graph.print()
|
|
|
|
|
|
|
|
|
|
/* 添加边 */
|
|
|
|
|
// 顶点 1, 2 即 v[0], v[2]
|
|
|
|
|
graph.addEdge(v[0]!!, v[2]!!)
|
|
|
|
|
println("\n添加边 1-2 后,图为")
|
|
|
|
|
graph.print()
|
|
|
|
|
|
|
|
|
|
/* 删除边 */
|
|
|
|
|
// 顶点 1, 3 即 v[0], v[1]
|
|
|
|
|
graph.removeEdge(v[0]!!, v[1]!!)
|
|
|
|
|
println("\n删除边 1-3 后,图为")
|
|
|
|
|
graph.print()
|
|
|
|
|
|
|
|
|
|
/* 添加顶点 */
|
|
|
|
|
val v5 = Vertex(6)
|
|
|
|
|
graph.addVertex(v5)
|
|
|
|
|
println("\n添加顶点 6 后,图为")
|
|
|
|
|
graph.print()
|
|
|
|
|
|
|
|
|
|
/* 删除顶点 */
|
|
|
|
|
// 顶点 3 即 v[1]
|
|
|
|
|
graph.removeVertex(v[1]!!)
|
|
|
|
|
println("\n删除顶点 3 后,图为")
|
|
|
|
|
graph.print()
|
|
|
|
|
}
|