首页 > 其他分享 >day59-graph theory-part09-8.30

day59-graph theory-part09-8.30

时间:2024-08-30 12:57:47浏览次数:12  
标签:part09 __ minDis day59 edge grid 8.30 main curNode

tasks for today:

1. digkstra 堆优化版 47.参加科学大会

2. bellman_ford算法 94.城市间货物运输I

---------------------------------------------------------------------------------

1. dijkstra 堆优化版

This is an optimization for the vanilla dijkstra, through using a heap to simplify the process of finding curNode in each round of updating, which also in turn simplifies the process of updating of minDis list in each round. Besides, using a adjcent list to replace the adjcent table.

import heapq

class Edge:
    def __init__(self, to, val):
        self.to = to
        self.val = val

def main():
    n, m = map(int, input().split())
    
    grid = [[] for _ in range(n+1)]
    
    for _ in range(m):
        s, e, v  = map(int, input().split())
        grid[s].append(Edge(e, v))
        
    visited = [False] * (n+1)
    minDis = [float('inf')] * (n+1)
    
    start = 1
    end = n
    
    curHQ = []
    
    heapq.heappush(curHQ, (0, start))
    
    minDis[start] = 0
    
    while curHQ:
        curDis, curNode = heapq.heappop(curHQ)
        
        if visited[curNode]: continue
        
        visited[curNode] = True
        
        for edge in grid[curNode]:
            if not visited[edge.to] and minDis[curNode] + edge.val < minDis[edge.to]:
                minDis[edge.to] = minDis[curNode] + edge.val
                heapq.heappush(curHQ, (minDis[edge.to], edge.to))
    
    if minDis[n] == float('inf'): 
        print(-1)
    else:
        print(minDis[n])
        
    return

if __name__ == "__main__":
    main()

2. bellman_ford算法 94.城市间货物运输I

In this practice, the edge weight can be negative, which is not suitable being solved by the dijkstra method, choose bellman-ford method.

start=1 end=n, do n-1 times' relaxation to find the min distance from starting point to all the other points.

def main():
    n, m = map(int, input().split())
    
    grid = []
    
    for _ in range(m):
        s, t, v = map(int, input().split())
        grid.append([s, t, v])
    
    minDis = [float('inf')] * (n+1)
    
    start = 1
    end = n
    
    minDis[start] = 0
    
    for _ in range(n-1):
        update = False
        for edge in grid:
            fromNode = edge[0]
            toNode = edge[1]
            weight = edge[2]
            if minDis[fromNode] != float('inf') and minDis[toNode] > minDis[fromNode] + weight:
                minDis[toNode] = minDis[fromNode] + weight
                update = True
        if not update:
            break
    
    if minDis[end] == float('inf'):
        print('unconnected')
    else:
        print(minDis[end])
    
    return


if __name__ == "__main__":
    main()

标签:part09,__,minDis,day59,edge,grid,8.30,main,curNode
From: https://blog.csdn.net/bbrruunnoo/article/details/141711127

相关文章

  • 代码随想录训练营 Day42打卡 动态规划 part09 188.买卖股票的最佳时机IV 309. 最佳买
    代码随想录训练营Day42打卡动态规划part09一、力扣188.买卖股票的最佳时机IV给你一个整数数组prices和一个整数k,其中prices[i]是某支给定的股票在第i天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成k笔交易。也就是说,你最多可以买k次......
  • 8.24~8.30 校内集训日志
    8.24模拟赛2024--梦熊&太戈--NOIP十三连测#6【订正】-比赛-梦熊联盟(mna.wang)A.Alice的数有显然的\(80\)分。但是还是用两个小时冲到了\(100\)分。做法比std复杂。\(100+100+100\)。题意令\(y^2\)是距离\(x\)最近的完全平方数,若有不止一个最近的直接输......
  • Day 42 动态规划 Part09
    188.买卖股票的最佳时机IV做完上一道题后再看就简单许多了。股票问题的重点就在于两点:找到所有的状态状态如何转移对于本题,一共包含2*k种状态(第1,2...k次持有,第1,2...k次卖出)。状态间如何转移呢?见下图classSolution{publicintmaxProfit(intk,int[]prices){......
  • Day 41 动态规划 Part09 开始炒股
    动态规划解题步骤确定dp数组(dptable)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组121.买卖股票的最佳时机这道题虽然自己做出来了,但是做了后面的题再回头看它就有了不一样的理解。curMin更重要的代表了一种状态,代表遍历到当前时间时最低的股......
  • Studying-代码随想录训练营day59| dijkstra(堆优化版)精讲、Bellman_ford 算法精讲
    第59天,dijkstra算法的优化版本,以及Bellman_ford算法......
  • 代码随想录算法训练营Day59 | 503.下一个更大元素II、42. 接雨水 | Python | 个人记录
    注:Day58是休息日。本文目录503.下一个更大元素II做题看文章42.接雨水做题看文章以往忽略的知识点小结个人体会503.下一个更大元素II代码随想录:503.下一个更大元素IILeetcode:503.下一个更大元素II做题和之前的739.每日温度一样,只不过可以循环,我这边是多遍历一......
  • 代码随想录 day59 两个字符串的删除操作 编辑距离
    两个字符串的删除操作两种思路如果是以最长公共子序列去理解求出这个子序列长度然后原长减一下就行如果是直接正面求解就是如下解法递推式很好理解初始化意思是当一个串为0长度时需要操作另一个字符串长度次也就是直接赋予下标编辑距离dp[i-1][j-1]+1意......
  • Day59 接口的定义与实现
    接口的定义与实现1.接口介绍普通类:只有具体实现抽象类:具体实现(普通方法)和规范(抽象方法)都有!接口:只有规范!(比抽象类还要抽象)自己无法写方法专业的约束!约束和实现分离:面向接口编程接口就是规范,定义的是一组规则,体现了现实世界中”如果你是...则必须能...”的思想。如果你是天使,......
  • Flask ORM 学习笔记Part09:数据查询(中)
    聚合操作聚合操作是指对一组值进行汇总、计算或统计的操作。这些操作通常应用于数据库中的列(字段),并用于生成单个标量值(例如平均值AVG、总和SUM、最大值MAX、最小值MIN、计数COUNT等)。示例代码fromappimportappfrommodelimport*frompprintimportpprintfromsqlalchemyi......
  • Flask ORM 学习笔记Part09:数据查询(上)
    前面的笔记,从Marshmallow开始就稍微有些跑题,今天记录一下如何使用Flask-SQLAlchemy进行数据查询。查询语法糖在前文中,有定义过一系列的model类,这里一Account类作为示例。fromappimportappfrommodelimport*fromschemaimport*frompprintimportpprint#fromsqlalchem......