目录

一、贝尔曼福特算法

二、实现

三、小结


一、贝尔曼福特算法

贝尔曼福特算法(Bellman-Ford)是由理查德·贝尔曼(Richard Bellman)和莱斯特·福特创立的,求解单源最短路径问题的一种算法。有时候这种算法也被称为Moore-Bellman-Ford算法,因为 Edward F. Moore 也为这个算法的发展做出了贡献。它的原理是对图进行V-1次松弛操作,得到所有可能的最短路径。其优于迪科斯彻算法的方面是边的权值可以为负数、实现简单,缺点是时间复杂度过高,高达O(VE)。

二、实现

package Algorithm.shortestpath

/*
* 图的边类
*/
public class Edge {
    // 源顶点、目标顶点、权重
    public Edge(public var source: Int64, public var destination: Int64, public var weight: Int64) {}
}

/*
* 贝尔曼福特算法
*/
public class BellmanFord {
    public static let MAX_VALUE = 1000000
    // 贝尔曼福特算法实现
    public static func bellmanFord(edges: Array<Edge>, vertexCount: Int64, source: Int64): Unit {
        // 初始化距离数组
        var distances = Array<Int64>(vertexCount, item: MAX_VALUE)
        // 源点到自身的距离为0
        distances[source] = 0
 
        // 松弛操作:对所有边进行V-1次处理
        for (_ in 0..vertexCount) {
            for (i in 0..edges.size) {
                let u = edges[i].source
                let v = edges[i].destination
                let weight = edges[i].weight

                // 如果u的距离不是无穷大,且存在更短的路径
                if (distances[u] != MAX_VALUE && distances[u] + weight < distances[v]) {
                    distances[v] = distances[u] + weight
                }
            }
        }
 
        // 检查是否存在负权环
        for (i in 0..edges.size) {
                let u = edges[i].source
                let v = edges[i].destination
                let weight = edges[i].weight

                if (distances[u] != MAX_VALUE && distances[u] + weight < distances[v]) {
                println("图中存在负权环,无法计算最短路径")
                return
            }
        }
 
        // 打印结果
        printResult(distances, source)
    }
 
    // 打印结果
    private static func printResult(distances: Array<Int64>, source: Int64): Unit {
        println("从顶点 ${source} 到各顶点的最短距离:")
        for (i in 0..distances.size) {
            if (distances[i] == MAX_VALUE) {
                println("顶点 ${i} 不可达")
            } else {
                println("顶点 ${i} 的距离: ${distances[i]}")
            }
        }
    }
}

测试代码

package Algorithm
import Algorithm.shortestpath.*
  
main(): Int64 {
    // 顶点数量
    let vertexCount = 5 
    let edges = [
        // 源顶点, 目标顶点, 权重
        Edge(0, 1, -1),
        Edge(0, 2, 4),
        Edge(1, 2, 3),
        Edge(1, 3, 2),
        Edge(1, 4, 2),
        Edge(3, 2, 5),
        Edge(3, 1, 1),
        Edge(4, 3, -3)
    ]
    // 源顶点
    let source = 0
    BellmanFord.bellmanFord(edges, vertexCount, source)
    
    return 0
}

三、小结

本章为大家详细的介绍了仓颉数据结构与算法中贝尔曼福特算法的内容,下一章,为大家带来SPFA算法的内容。最后,创作不易,如果大家觉得我的文章对学习仓颉数据结构与算法有帮助的话,就动动小手,点个免费的赞吧!收到的赞越多,我的创作动力也会越大哦,谢谢大家🌹🌹🌹!!!

Logo

昇腾计算产业是基于昇腾系列(HUAWEI Ascend)处理器和基础软件构建的全栈 AI计算基础设施、行业应用及服务,https://devpress.csdn.net/organization/setting/general/146749包括昇腾系列处理器、系列硬件、CANN、AI计算框架、应用使能、开发工具链、管理运维工具、行业应用及服务等全产业链

更多推荐