写一个支持负权边的图最短路径算法(Bellman-Ford)

Bellman-Ford 算法是一种用于计算单源最短路径的算法,特别适用于存在负权边的图。与 Dijkstra 算法不同,Bellman-Ford 算法可以处理负权边,并且能够检测到负权环的存在。

以下是 Bellman-Ford 算法的 Python 实现:

pythonCopy Codeclass Graph:    def __init__(self, vertices):
        self.V = vertices  # 图的顶点数
        self.edges = []    # 图的边集,存储为 (source, destination, weight) 的形式
    def add_edge(self, u, v, w):
        self.edges.append((u, v, w))    def bellman_ford(self, src):        # 初始化距离数组,所有距离设置为无穷大,源点距离设置为 0
        dist = [float('inf')] * self.V
        dist[src] = 0
        # 进行 V-1 次松弛操作
        for _ in range(self.V - 1):            for u, v, w in self.edges:                if dist[u] != float('inf') and dist[u] + w < dist[v]:
                    dist[v] = dist[u] + w        # 检测负权环
        for u, v, w in self.edges:            if dist[u] != float('inf') and dist[u] + w < dist[v]:                print("图中包含负权环")                return None  # 返回 None 表示存在负权环
        return dist# 示例使用g = Graph(5)
g.add_edge(0, 1, -1)
g.add_edge(0, 2, 4)
g.add_edge(1, 2, 3)
g.add_edge(1, 3, 2)
g.add_edge(1, 4, 2)
g.add_edge(3, 2, 5)
g.add_edge(3, 1, 1)
g.add_edge(4, 3, -3)# 计算从源点 0 到其他所有顶点的最短路径distances = g.bellman_ford(0)if distances is not None:    print("从源点 0 到其他顶点的最短路径距离:")    for i in range(g.V):        print(f"到顶点 {i} 的距离: {distances[i]}")

代码说明:

  1. Graph 类‌:

    • __init__ 方法初始化图的顶点数和边集。
    • add_edge 方法用于向图中添加边。
  2. Bellman-Ford 算法‌:

    • 初始化距离数组  dist,源点的距离设置为 0,其他点的距离设置为无穷大。
    • 进行  V-1 次松弛操作,每次遍历所有边,尝试更新每个顶点的最短距离。
    • 在完成  V-1 次松弛后,再次遍历所有边,检查是否还能进行松弛操作。如果可以,说明图中存在负权环。
  3. 负权环检测‌:

    • 如果在  V-1 次松弛后,还能进行松弛操作,则图中存在负权环。
  4. 示例使用‌:

    • 创建一个图并添加边。
    • 调用  bellman_ford 方法计算从源点到其他所有顶点的最短路径。
    • 如果检测到负权环,输出提示信息;否则,输出最短路径距离。

Bellman-Ford 算法的时间复杂度为  O(V×E) O ( V × E ),其中  V V 是顶点数, E E 是边数。这使得它适用于边数较多的图,尤其是可能存在负权边的图。


http://www.zgjzs.org

http://www.shangpin.org

http://www.snjrw.org

http://wangluo.zgjzs.org

http://zhineng.zgjzs.org

http://gaosu.zgjzs.org

http://anquan.zgjzs.org

http://wangzhan.zgjzs.org

http://jiaoyu.zgjzs.org

http://guanggao.zgjzs.org

http://shuju.zgjzs.org

http://zhifu.zgjzs.org

http://yingyong.zgjzs.org

http://yonghu.zgjzs.org

http://houtai.zgjzs.org

http://fenxi.zgjzs.org

http://jiekou.zgjzs.org

http://fenxiang.zgjzs.org

http://neirong.zgjzs.org

http://zhuce.zgjzs.org

http://tongji.zgjzs.org

http://ditu.zgjzs.org

http://tuisong.zgjzs.org

http://gouwu.zgjzs.org

http://tuiguang.zgjzs.org

http://shejiao.zgjzs.org

http://zhongguo.zgjzs.org

http://wangguan.zgjzs.org

http://yule.zgjzs.org

http://pingtai.zgjzs.org

http://jichu.zgjzs.org

http://wangjie.zgjzs.org

http://zhishi.zgjzs.org

http://shangcheng.zgjzs.org

http://dianzi.zgjzs.org

http://yinyue.zgjzs.org

http://tupian.zgjzs.org

http://shipin.zgjzs.org

http://wuliu.zgjzs.org

http://gongju.zgjzs.org

http://anquan.zgjzs.org

http://sousuo.zgjzs.org

http://mima.zgjzs.org

http://jiankong.zgjzs.org

http://ceshi.zgjzs.org

http://wangyou.zgjzs.org

http://zixun.zgjzs.org

http://chajian.zgjzs.org

http://kuaidi.zgjzs.org

http://liuliang.zgjzs.org

http://zhengce.zgjzs.org

http://peizhi.zgjzs.org

http://baocun.zgjzs.org

http://yonghu.shangpin.org

http://houtai.shangpin.org

http://pingtai.shangpin.org

http://wangzhan.shangpin.org

http://zhifu.shangpin.org

http://guanggao.shangpin.org

http://yinyue.shangpin.org

http://zixun.shangpin.org

http://shejiao.shangpin.org

http://tuisong.shangpin.org

http://wangguan.shangpin.org

http://zhineng.shangpin.org

http://wangluo.shangpin.org

http://anquan.shangpin.org

http://zhongguo.shangpin.org

http://shuju.shangpin.org

http://jiekou.shangpin.org

http://zhishi.shangpin.org

http://gongneng.shangpin.org

http://tongji.shangpin.org

http://shipin.shangpin.org

http://jiaoyu.shangpin.org

http://ditu.shangpin.org

http://dianzi.shangpin.org

http://mima.shangpin.org

http://liuliang.shangpin.org

http://gouwu.shangpin.org

http://zhengce.shangpin.org

http://yule.shangpin.org

http://baocun.shangpin.org

http://jichu.shangpin.org

http://fenxi.shangpin.org

http://fenxiang.shangpin.org

http://shangcheng.shangpin.org

http://kuaidi.shangpin.org

http://peizhi.shangpin.org

http://wuliu.shangpin.org

http://ceshi.shangpin.org

http://tupian.shangpin.org

http://wangyou.shangpin.org

http://chajian.shangpin.org

http://tuiguang.shangpin.org

http://yingyong.shangpin.org

http://zhuce.shangpin.org

http://sousuo.shangpin.org

http://jiankong.shangpin.org

http://neirong.shangpin.org

http://gongju.shangpin.org

http://zonghe.shangpin.org

http://zhifu.snjrw.org

http://houtai.snjrw.org

http://yule.snjrw.org

http://wangluo.snjrw.org

http://guanggao.snjrw.org

http://shuju.snjrw.org

http://pingtai.snjrw.org

http://ditu.snjrw.org

http://wangzhan.snjrw.org

http://shejiao.snjrw.org

http://jiekou.snjrw.org

http://zhishi.snjrw.org

http://zhineng.snjrw.org

http://jiaoyu.snjrw.org

http://zhongguo.snjrw.org

http://yinyue.snjrw.org

http://yonghu.snjrw.org

http://tuiguang.snjrw.org

http://gouwu.snjrw.org

http://baocun.snjrw.org

http://fenxiang.snjrw.org

http://fenxi.snjrw.org

http://gongneng.snjrw.org

http://wangguan.snjrw.org

http://zixun.snjrw.org

http://dianzi.snjrw.org

http://tupian.snjrw.org

http://wangyou.snjrw.org

http://chajian.snjrw.org

http://wuliu.snjrw.org

http://mima.snjrw.org

http://liuliang.snjrw.org

http://zhuce.snjrw.org

http://zhengce.snjrw.org

http://peizhi.snjrw.org

http://shipin.snjrw.org

http://jichu.snjrw.org

http://tongji.snjrw.org

http://kuaidi.snjrw.org

http://yingyong.snjrw.org

http://sousuo.snjrw.org

http://jiankong.snjrw.org

http://neirong.snjrw.org

http://gongju.snjrw.org

http://tuisong.snjrw.org

http://shangcheng.snjrw.org

http://anli.snjrw.org

http://dianhua.snjrw.org

http://fuwu.snjrw.org

请使用浏览器的分享功能分享到微信等