首页 > 编程语言 >代码随想录算法训练营第61天 | 图论part08:拓扑排序+迪杰斯特拉朴素法

代码随想录算法训练营第61天 | 图论part08:拓扑排序+迪杰斯特拉朴素法

时间:2024-08-07 10:27:40浏览次数:15  
标签:part08 ingree 随想录 拓扑 迪杰 queue range 排序 节点

117.软件构建
https://kamacoder.com/problempage.php?pid=1191
拓扑排序精讲
https://www.programmercarl.com/kamacoder/0117.软件构建.html#拓扑排序的背景
47.参加科学大会
https://kamacoder.com/problempage.php?pid=1047
dijkstra(朴素版)精讲
https://www.programmercarl.com/kamacoder/0047.参会dijkstra朴素.html#思路

拓扑排序

  • 拓扑排序是经典的图论问题:依赖关系是否成立

    • 简述:一个有向图->线性排序
    • 判断是否有环
  • 方法:BFS(主要)和DFS

  • 关键:找到入度为0的节点就是出发节点

  • 主要步骤:

    • 找到入度为0的节点,加入结果集;
    • 将该节点从图中移除
    点击查看代码
    from collections import deque
    
    def main():
    	n,m = map(int,input().split())
    	ingree = [0]*n
    	umap = [[] for _ in range(n)]
    	res = []
    	##构建邻接链表
    	for _ in range(m):
    		s,t = map(int,input().split())
    		umap[s].append(t)
    		ingree[t]+=1
    	##找到入度为0的节点
    	queue = deque([])
    	for i in range(n):
    		if ingree[i]==0:
    			queue.append(i)
    	##遍历找到入度为0的节点
    	while queue:
    		curr = queue.popleft()
    		res.append(curr)
    		files = umap[curr]
    		if len(files)>0:
    			for file in files:
    				ingree[file]-=1
    				if ingree[file]==0:
    					queue.append(file)
    	if len(res)==n:
    		print(" ".join(map(str,res)))
    	else:
    		print("-1")
    
    if __name__ == '__main__':
    	main()
    

dijkstra(朴素版)精讲

  • 三部曲

    1. 选择源点到哪个节点近 且 未被访问过;
    2. 该最近节点被标记访问过;
    3. 更新非访问节点到源点的距离(minDist数组);
  • minDist:源点到每个下一个点的最小值;选择最小值作为下一个点;

    点击查看代码
    def dijkstra(n, m, grid, start, end):
    	mindist = [float("inf")]*(n+1)
    	visited = [False]*(n+1)
    	mindist[start] = 0
    	for i in range(1,n+1):
    		minval = float("inf")
    		curr = 1
    		for v in range(1,n+1):
    			if not visited[v] and mindist[v]<minval:
    				minval = mindist[v]
    				curr = v
    		visited[curr] = True
    		for k in range(1,n+1):
    			if not visited[k] and grid[curr][k]!=float("inf") and mindist[curr]+grid[curr][k]<mindist[k]:
    				mindist[k] = mindist[curr]+grid[curr][k]
    	if mindist[end]==float("inf"):
    		return -1
    	else:
    		return mindist[end]
    
    def main():
    	n,m = map(int,input().split())
    	grid = [[float("inf")]*(n+1) for _ in range(n+1)]
    	for i in range(m):
    		s,e,v = map(int,input().split())
    		grid[s][e] = v
    	res = dijkstra(n,m,grid,1,n)
    	print(res)
    
    if __name__ == '__main__':
    	main()
    

标签:part08,ingree,随想录,拓扑,迪杰,queue,range,排序,节点
From: https://www.cnblogs.com/P201821440041/p/18345991

相关文章

  • 代码随想录 day 47 回文子串 | 最长回文子序列
    回文子串回文子串解题思路dp数组的状态是判断以i结尾,j开始的字符串是否为回文,用bool类型存储,之后当i和j的字符串相等时,通过计算它们之间的距离和判断它们之间是否为回文串来进行递归。知识点回文,动态规划心得如果不看题解根本想不到怎么做最长回文子序列最长回文子序列......
  • 代码随想录算法训练营第七天|454.四数相加II,383. 赎金信,15. 三数之和,18. 四数之和,总结
    力扣题部分:454.四数相加II题目链接:.-力扣(LeetCode) ​​​​​思路(map哈希表):    将数组分为两组分别用双重for循环遍历。第一组将来自不同数组的两个数之和(记为sum1)作为map的key,两个数之和出现的次数作为map的value,第二组通过在map查询来自不同数组的两......
  • 代码随想录算法训练营第59天 | 最小生成树
    53.寻宝https://kamacoder.com/problempage.php?pid=1053prim算法精讲https://www.programmercarl.com/kamacoder/0053.寻宝-prim.htmlkruskal算法精讲https://www.programmercarl.com/kamacoder/0053.寻宝-Kruskal.html题目描述在世界的某个区域,有一些分散的神秘岛屿,每......
  • 代码随想录Day7
    454.四数相加Ⅱ给你四个整数数组nums1、nums2、nums3和nums4,数组长度都是n,请你计算有多少个元组(i,j,k,l)能满足:0<=i,j,k,l<nnums1[i]+nums2[j]+nums3[k]+nums4[l]==0示例1:输入:nums1=[1,2],nums2=[-2,-1],nums3=[-1,2],nums4=[0,2]输......
  • 代码随想录Day6
    454.四数相加Ⅱ给你四个整数数组nums1、nums2、nums3和nums4,数组长度都是n,请你计算有多少个元组(i,j,k,l)能满足:0<=i,j,k,l<nnums1[i]+nums2[j]+nums3[k]+nums4[l]==0示例1:输入:nums1=[1,2],nums2=[-2,-1],nums3=[-1,2],nums4=[0,2]输......
  • 「代码随想录算法训练营」第三十天 | 动态规划 part3
    46.携带研究材料(0-1背包问题)题目链接:https://kamacoder.com/problempage.php?pid=1046文章讲解:https://programmercarl.com/背包理论基础01背包-1.html视频讲解:https://www.bilibili.com/video/BV1cg411g7Y6/题目状态:看题解过思路:创建一个二维的dp数组,用来进行动态规划,其......
  • 代码随想录二刷栈与队列
    代码随想录二刷栈与队列栈模拟队列具体思路如下:程序如下:classMyQueue:def__init__(self):self.stack_in=[]self.stack_out=[]defpush(self,x:int)->None:self.stack_in.append(x)defpop(self)->int:if......
  • Studying-代码随想录训练营day59| dijkstra(堆优化版)精讲、Bellman_ford 算法精讲
    第59天,dijkstra算法的优化版本,以及Bellman_ford算法......
  • 代码随想录Day5
    242.有效的字母异位词给定两个字符串s和t,编写一个函数来判断t是否是s的字母异位词。注意:若s和t中每个字符出现的次数都相同,则称s和t互为字母异位词。示例1:输入:s="anagram",t="nagaram"输出:true示例2:输入:s="rat",t="car"输出:false......
  • 代码随想录算法训练营day04之字符串
    题目及链接:344.反转字符串541.反转字符串||卡码网54.替换数字151.翻转字符串里的单词卡码网55.右旋字符串28.找出字符串中第一个匹配项的下标459.重复的子字符串344.反转字符串太简单就不写了541.反转字符串||题意:给定一个字符串s和一个整数k,从字符串开头算起,每......