首页 > 编程语言 >代码随想录算法训练营day59| 47.参加科学大会 94.城市间货物运输

代码随想录算法训练营day59| 47.参加科学大会 94.城市间货物运输

时间:2024-11-27 20:43:57浏览次数:6  
标签:cur val 47 随想录 edge start dijkstra minDist 94

学习资料:https://www.programmercarl.com/kamacoder/0047.参会dijkstra堆.html#思路

dijkstra 堆优化
节点少:用邻接矩阵
边少:用邻接表

Bellman_ford算法
边的权值有负数;对所有边进行松弛n-1次的操作
松弛(A---value--->B)
if minDist[B]>minDist[A]+value:
minDist[B] = minDist[A]+value

学习记录:
47.参加科学大会(如果边少,可以考虑堆优化)

点击查看代码
# dijkstra算法-最小堆;适用于稀疏图,边少,从边出发;邻接表
import heapq

class Edge:
    def __init__(self, to, val):
        """用于定义邻接表,键值对,键是起始节点,值是(指向的节点,边的权值)"""
        self.to = to   # 指向的节点
        self.val = val  # 边的权值

def dijkstra(n, m, edges, start, end):
    grid = [[] for _ in range(n+1)]  # 邻接表
    for p1,p2,val in edges:
        grid[p1].append(Edge(p2, val))
    minDist = [float('inf')] * (n+1)
    visited = [False]*(n+1)
    
    pq = []
    heapq.heappush(pq, (0, start))
    minDist[start] = 0
    
    while pq:
        cur_dist, cur_node = heapq.heappop(pq)
        if visited[cur_node]:
            continue
        visited[cur_node] = True
        
        for edge in grid[cur_node]:
            if not visited[edge.to] and cur_dist+edge.val < minDist[edge.to]:
                minDist[edge.to] = cur_dist+edge.val
                heapq.heappush(pq, (minDist[edge.to], edge.to))
    return -1 if minDist[end]==float('inf') else minDist[end]

# 输入值
n, m = map(int, input().split())
edges = []
for i in range(m):
    edges.append(list(map(int, input().split())))
    start = 1
    end = n
# 输出结果
result = dijkstra(n, m, edges, start, end)
print(result)




# # dijkstra算法,类似于prim
# # 统计每个节点到源点的最小距离(minDist),和是否被访问过(visited)
# # 找到距离源点最近的未访问过的节点,选中它;将它标记为访问过;更新minDist

# def dijkstra(n, m, start, end):
#     # 初始化邻接矩阵,每个节点到源点的距离都设置为无穷大,因为后面要保存最短距离
#     grid = [[float('inf')]*(n+1) for _ in range(n+1)]
#     for p1, p2, val in edges:
#         grid[p1][p2] = val
    
#     # 初始化距离数组,都为无穷大
#     minDist = [float('inf')]*(n+1)
#     minDist[start]=0  # 自己到自己的距离为0
#     # 访问数组,初始为未访问
#     visited = [False]*(n+1)
    
#     # 遍历所有节点
#     for _ in range(1, n+1):
#         minVal = float('inf')
#         cur = -1
        
#         # 选择距离源点最近且未访问过的节点
#         for v in range(1, n+1):
#             if not visited[v] and minDist[v]<minVal:
#                 minVal = minDist[v]
#                 cur = v
#         # 若节点都访问过,则提前结束
#         if cur == -1:
#             break
#         # 标记该节点为被访问
#         visited[cur] = True
        
#         # 更新剩余未访问节点到源点的距离 ????? 真没看懂啊!!!!!
#         for v in range(1, n+1):
#             if not visited[v] and grid[cur][v] != float('inf') and minDist[cur]+grid[cur][v]<minDist[v]:
#                 minDist[v] = minDist[cur]+grid[cur][v]
#     return -1 if minDist[end]==float('inf') else minDist[end]
    
# # 输入值
# n, m = map(int, input().split())
# edges = []
# for _ in range(m):
#     edges.append(list(map(int, input().split())))
# start = 1
# end = n
# result = dijkstra(n, m, start, end)
# print(result)

PS:今天出太阳啦,好舒服
今天的题更看不懂了,难办,慢慢来吧
今天吃了肉夹馍做的一般般,还是好困,今天一定早睡,论文基本

标签:cur,val,47,随想录,edge,start,dijkstra,minDist,94
From: https://www.cnblogs.com/tristan241001/p/18573073

相关文章

  • 代码随想录算法训练营第十四天(统一迭代;LeetCode226.翻转二叉树;LeetCode101.对称二叉树
    统一迭代LeetCode144.二叉树的前序遍历题目链接:二叉树的前序遍历题目链接代码/***Definitionforabinarytreenode.*publicclassTreeNode{*intval;*TreeNodeleft;*TreeNoderight;*TreeNode(){}*TreeNode(intval)......
  • 【以太网接口芯片----CH394 Webserver应用】使用以太网接口芯片CH394芯片搭建Webserve
    一、简介:本文会基于沁恒微电子最新的以太网协议栈芯片CH394来做一个远程Web浏览器控制的示例(主控芯片为CH32V307,SPI接口),简单演示通过以太网进行参数修改、数据传输、远程控制。相较于之前的CH395芯片,CH394的通信速度更快、功耗更低、外围电路更精简,因此选择CH394芯片来拓展需......
  • 代码随想录:赎金信
    代码随想录:赎金信同上题classSolution{public:boolcanConstruct(stringransomNote,stringmagazine){//其实就26个字母可以用数组的,懒得改了unordered_map<char,int>maga;for(charc:magazine){autoit=maga.find(......
  • 代码随想录:四数相加 II
    代码随想录:四数相加II我还以为会有更快的速度呢。。没想到最佳答案就是n^2不过值得一提的,这题一开始可能会想到用multiset来解决重复出现的元素,但实际上,multiset的查询速度是logn,是不如用哈希表的,所以用unordered_map,用键值对的值来表示元素出现的次数。classSolution{publ......
  • 代码随想录算法训练营day58| 117.软件构建 47.参加科学大会
    学习资料:https://www.programmercarl.com/kamacoder/0117.软件构建.html#拓扑排序的背景图论拓扑排序:收集入度为0的节点,删掉该节点后其他节点的入度可能变化,记得更新,然后继续删除入度为0的点,直到没有。整个过程的顺序就对应了有向图dijkstra算法:类似prim,也是贪心,找距离源点最近......
  • 洛谷P1478(洛谷P1223)
    因为这两题相似,把它们放在一个博客里面发了陶陶摘苹果(升级版)-洛谷陶陶摘苹果(升级版)题目描述又是一年秋季时,陶陶家的苹果树结了n个果子。陶陶又跑去摘苹果,这次他有一个a公分的椅子。当他手够不着时,他会站到椅子上再试试。这次与NOIp2005普及组第一题不同的是:陶陶之前搬......
  • 代码随想录算法训练营第十一天(LeetCode150.逆波兰表达式求值;LeetCode239.滑动窗口最大
    LeetCode150.逆波兰表达式求值题目链接:逆波兰表达式求值题目链接思路主要是要理解逆波兰表达式的定义,在理解了逆波兰表达式的定义后,使用栈就可以直接做了。逆波兰表达式是一种后缀表达式,所谓后缀就是指运算符写在后面。平常使用的算式则是一种中缀表达式,如(1+2)......
  • 代码随想录算法训练营第十天(LeetCode232.用栈实现队列;LeetCode225.用队列实现栈;LeetCo
    LeetCode232.用栈实现队列题目链接:用栈实现队列题目链接思路队列是先进先出,栈是先进后出,为了能够让栈可以模拟队列的先进先出,我们设置两个栈,一个栈作为入栈,一个栈作为出栈,我们在入栈存储完数据后,将入栈中的数据全部存储到出栈中,那么从出栈中弹出来的数据就是先进先出的......
  • SpringBoot游戏玩家服务平台94g73 程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表系统内容:用户,商家,游戏陪玩,陪玩预约,游戏装备,订单信息,账号买卖,账号订单,退订单,评价信息开题报告内容项目名称:SpringBoot游戏玩家服务平台(94g73)一、项目......
  • 代码随想录——26、二叉(搜索)树的最近公共祖先
    递归最近公共祖先定义:设节点root为节点p,q的某公共祖先,若其左子节点root.left和右子节点root.right都不是p,q的公共祖先,则称root是“最近的公共祖先”。若root是p,q的最近公共祖先,则只可能为以下情况之一如果p和q在节点root的两侧,那么root就是最近公共祖先p......