代码随想录算法训练营第六十一天|Bellman_ford 队列优化算法(又名SPFA)、bellman_ford之判断负权回路

卡码网:94. 城市间货物运输 I

from collections import deque

class Edge:
    def __init__(self, to, val):
        self.to = to  # 链接的节点
        self.val = val  # 边的权重

def main():
    n, m = map(int, input().split())
    grid = [list() for _ in range(n + 1)]  # 初始化邻接表
    for _ in range(m):
        p1, p2, val = map(int, input().split())
        grid[p1].append(Edge(p2, val))  # p1 指向 p2,权值为 val

    start = 1  # 起点
    end = n    # 终点

    min_dist = [float('inf')] * (n + 1)  # 存储从起点到每个节点的最短距离
    min_dist[start] = 0

    que = deque([start])  # 使用双端队列存储已访问节点
    is_in_queue = [False] * (n + 1)  # 标记是否在队列中

    while que:
        node = que.popleft()
        is_in_queue[node] = False  # 从队列中移除节点
        for edge in grid[node]:
            to = edge.to
            value = edge.val
            if min_dist[to] > min_dist[node] + value:  # 开始松弛
                min_dist[to] = min_dist[node] + value
                if not is_in_queue[to]:  # 如果节点不在队列中,则加入队列
                    que.append(to)
                    is_in_queue[to] = True

    if min_dist[end] == float('inf'):
        print("unconnected")  # 不能到达终点
    else:
        print(min_dist[end])  # 打印到达终点的最短路径长度

if __name__ == "__main__":
    main()

卡码网:95. 城市间货物运输 II

from collections import deque

class Edge:
    def __init__(self, to, val):
        self.to = to  # 链接的节点
        self.val = val  # 边的权重

def main():
    n, m = map(int, input().split())

    grid = [list() for _ in range(n + 1)]  # 邻接表
    # 将所有边保存起来
    for _ in range(m):
        p1, p2, val = map(int, input().split())
        grid[p1].append(Edge(p2, val))  # p1 指向 p2,权值为 val

    start = 1  # 起点
    end = n    # 终点

    min_dist = [float('inf')] * (n + 1)  # 存储从起点到每个节点的最短距离
    min_dist[start] = 0

    que = deque([start])  # 使用双端队列存储已访问节点
    count = [0] * (n + 1)  # 记录节点加入队列几次
    count[start] = 1

    flag = False
    while que:
        node = que.popleft()

        for edge in grid[node]:
            to = edge.to
            value = edge.val
            if min_dist[to] > min_dist[node] + value:  # 开始松弛
                min_dist[to] = min_dist[node] + value
                que.append(to)
                count[to] += 1
                if count[to] == n:  # 如果加入队列次数超过 n-1次 就说明该图与负权回路
                    flag = True
                    break

        if flag:
            break

    if flag:
        print("circle")
    elif min_dist[end] == float('inf'):
        print("unconnected")
    else:
        print(min_dist[end])

if __name__ == "__main__":
    main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值