看下面这幅图
什么是有向图
定义:有向图是一副具有方向性的图,是有一组顶点和一组有方向的边组成的,每条方向的边都连接着一对有序的顶点。
有向图相关术语
- 出度:有某个顶点指出的边的个数称为该顶点的出度。
- 入度:指向某个顶点的边的个数称为该顶点的入度。
- 度:入度+出度,称为该顶点的度。
import UIKit
// careate a list node
class ListNode<T: Equatable & CustomStringConvertible> {
var value: T // store a node value
var next: ListNode? // store next node value
var weighted: Int
var index: Int // implement add and remove method
var distance: Int
init(value: T,
next: ListNode? = nil,
weighted: Int = 0,
index: Int = -1,
distance: Int = Int.max
) {
self.value = value
self.next = next
self.weighted = weighted
self.index = index
self.distance = distance
}
}
class Edge<T: Equatable & CustomStringConvertible> {
var start: T
var end: T
var startIndex: Int
var endIndex: Int
var weight: Int
init(start: T,
end: T,
startIndex: Int,
endIndex: Int,
weight: Int = 0
) {
self.start = start
self.end = end
self.startIndex = startIndex
self.endIndex = endIndex
self.weight = weight
}
}
class ListPraph<T: Equatable & CustomStringConvertible> {
private(set) var count: Int
private(set) var vertexArr: [ListNode<T>] // store all vertexes
init() {
count = 0
vertexArr = []
}
func addVertex(_ vertex: T) -> Self {
count += 1
vertexArr.append(ListNode(value: vertex,index: count-1))
return self
}
// Get Array index from vertex Array
func indexof(_ vertex: T) -> Int? {
return vertexArr.firstIndex {$0.value == vertex }
}
func addEdge(from: T, to: T, weight: Int = 0) -> Bool {
guard let f = indexof(from), let t = indexof(to), f != t else {return false}
// use linked list show the directed node
let toNode = ListNode(value: to, next: vertexArr[f].next, weighted: weight, index: t)
vertexArr[f].next = toNode
return true
}
func print() {
Swift.print("邻接表有向图图")
for i in 0..<count {
Swift.print("\(vertexArr[i].value)", terminator: "")
var p = vertexArr[i].next
if p == nil {
Swift.print("no node")
}
while p != nil {
Swift.print("-> (权重:\(p!.weighted))\(p!.value)", terminator: " ")
p = p?.next
}
Swift.print("")
}
}
}
let ulListGraph = ListPraph<String>()
ulListGraph.addVertex("V0").addVertex("V1")
ulListGraph.addVertex("V2").addVertex("V3").addVertex("V4")
ulListGraph.addEdge(from: "V0", to: "V1", weight: 6)
ulListGraph.addEdge(from: "V1", to: "V0", weight: 9)
ulListGraph.addEdge(from: "V1", to: "V2", weight: 3)
ulListGraph.addEdge(from: "V2", to: "V0", weight: 2)
ulListGraph.addEdge(from: "V2", to: "V3", weight: 5)
ulListGraph.addEdge(from: "V3", to: "V4", weight: 1)
ulListGraph.print()