美文网首页
图最短路径

图最短路径

作者: 今年27 | 来源:发表于2022-07-20 14:01 被阅读0次
let maxvex = 20
let maxedge = 20
let infinity = 65535
var PathArc:[Int] = [Int](repeating: 0, count: maxvex) //存储最短路径上的顶点坐标
var ShortPathWeightTable:[Int] = [Int](repeating: 0, count: maxvex) //存储起始点到目标点之间经过的各个点的权值
struct MGraph{
    var vexs:[Int]
    var arc:[[Int]]
    var numVertexes:Int
    var numEdges:Int
    init() {
        self.arc = [[Int]](repeating: [Int](repeating: 0, count: maxvex), count: maxvex)
        self.numVertexes = 9
        self.numEdges=16
        self.vexs = [Int](repeating: 0, count: self.numVertexes)
        for i in 0..<self.numVertexes {
            self.vexs[i] = i
        }
        for i in 0..<self.numVertexes {
            for j in 0..<self.numVertexes {
                if (i == j) {
                    self.arc[i][j] = 0
                } else{
                    self.arc[i][j] = infinity
                    self.arc[j][i] = self.arc[i][j]
                }
            }
        }
        self.arc[0][1]=1;
        self.arc[0][2]=5;
        self.arc[1][2]=3;
        self.arc[1][3]=7;
        self.arc[1][4]=5;
        
        self.arc[2][4]=1;
        self.arc[2][5]=7;
        self.arc[3][4]=2;
        self.arc[3][6]=3;
        self.arc[4][5]=3;
        
        self.arc[4][6]=6;
        self.arc[4][7]=9;
        self.arc[5][7]=5;
        self.arc[6][7]=2;
        self.arc[6][8]=7;
        
        self.arc[7][8]=4;
        
        for i in 0..<self.numVertexes {
            for j in 0..<self.numVertexes {
                self.arc[j][i] = self.arc[i][j]
            }
        }
    }

}

func shortestPath_Dijkstra(_ graph:MGraph, _ v0:Int){
    var final:[Int] = [Int](repeating: 0, count: graph.numVertexes)
    for i in 0..<graph.numVertexes {
        ShortPathWeightTable[i] = graph.arc[v0][i] //初始化权值数组为v0所连接的1,2,3,4,5,6,7的权值
    }
    ShortPathWeightTable[0] = 0 //V0到V0自己权值为0
    final[v0] = 1 //V0此时标记为已处理
    PathArc[v0] = -1 //V0到V0的自己的下标不存在的
    
    for _ in 1..<graph.numVertexes {//从接下来第一个点开始
        var k = 0
        var min = infinity //默认最小距离为无限
        for j in 1..<graph.numVertexes {
            if (final[j] != 1 && ShortPathWeightTable[j] < min) {//找到当前已记录最小权值路径的点
                min = ShortPathWeightTable[j]
                k = j
            }
        }
        final[k] = 1 //标记为已处理
        print("k:",k)
        for j in 1..<graph.numVertexes{
            if (final[j] != 1 && graph.arc[k][j] + min < ShortPathWeightTable[j]) {//如果k与j之间的权值+min < 这个最j对应的最小权值则说明k才是最优解
                ShortPathWeightTable[j] = graph.arc[k][j] + min//更新权值表
                PathArc[j] = k//将K的坐标存入数组顶点中
                print("j:", j, "k:", k)
            }
        }
    }
}

func main(){
    let graph = MGraph()
    shortestPath_Dijkstra(graph, 0)
    
    var j = 0
    for i in 1 ..< graph.numVertexes {
        print("v0->v", i)
        j = i
        while (PathArc[j] != -1) {
            print(PathArc[j])
            j = PathArc[j]
        }
    }
    for i in 1..<graph.numVertexes {
        print("v\(graph.vexs[0]) -> v\(graph.vexs[i]) :\(ShortPathWeightTable[i])")
    }
}

main()

相关文章

  • 图的应用-最短路径求解

    图的最短路径   图的最短路径是一个起点到一个终点之间最短的路径。  用于解决最短路径问题的算法被称做“最短路径算...

  • 最短路径问题

    无权图单源最短路径 有权图单源最短路径 有权图单源最短路径和无权图最短路径不一样,不能单从节点数来看,比如上图中,...

  • 【数据结构】最短路径之迪杰斯特拉(Dijkstra)算法与弗洛伊

    图的最短路径 【对于非网图】没有边上的权值,它的最短路径就是两个顶点之间经过的边数目最少的路径。 【对于网图】最短...

  • 最短路径

    无权图的最短路径用BFS来求 O(|V|+|E|) 有向带权图两点之间的最短路径也包含了路径上其他顶点间的最短路径...

  • 图-最短路径-迪杰斯特拉算法

    最短路径 在网图和非网图中,最短路径的含义是不同的。对于非网图,由于其边上没有权值,所谓的最短路径,其实就是指两顶...

  • 图 求解最短路径 时间复杂度 空间复杂度 单源最短路径 多源最短路径 条数最短(点权为1) 边权之和最小或最大(花...

  • 最短路径

    最短路径 在网图和非网图中,最短路径的含义是不同的。由于非网图没有边上的权值,所谓的最短路径其实是指两顶点之间经过...

  • 19-最短路径(Shortest Path)

    最短路径(Shortest Path) 最短路径是指两个顶点之间权值之和最小的路径(有向图,无向图均可,不能有负权...

  • 数据结构与算法-图的最短路径Dijkstra算法&Floyd算法

    最短路径 最短路径问题是图论研究中的一个经典算法问题, 旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。在...

  • 算法 | 最短路径问题

    最短路径 最短路径问题是图论研究中的一个经典算法问题, 旨在寻找图(由结点和路径组成的)中两结点之间的最短路径,在...

网友评论

      本文标题:图最短路径

      本文链接:https://www.haomeiwen.com/subject/ekgeirtx.html