Swift 算法- 图(Graph)

254 阅读1分钟

看下面这幅图

什么是有向图

定义:有向图是一副具有方向性的图,是有一组顶点和一组有方向的边组成的,每条方向的边都连接着一对有序的顶点。

有向图相关术语

  • 出度:有某个顶点指出的边的个数称为该顶点的出度。
  • 入度:指向某个顶点的边的个数称为该顶点的入度。
  • 度:入度+出度,称为该顶点的度。

image.png

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()

image.png