代码随想录算法训练营DAY64|拓扑排序、dijkstra(质朴版) ...

打印 上一主题 下一主题

主题 1961|帖子 1961|积分 5883

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
拓扑排序精讲

  1. from collections import deque
  2. def bfs(degrees):
  3.     nodes = deque()
  4.     for j in range(n):
  5.         if degrees[j]==0:
  6.             nodes.append(j)
  7.     result = []        
  8.     while nodes:
  9.         idx = nodes.popleft()
  10.         result.append(str(idx))
  11.         if depend[idx]:
  12.             for file in depend[idx]:
  13.                 degrees[file]-=1
  14.                 if degrees[file]==0:
  15.                     nodes.append(file)
  16.     if len(result)==n:
  17.         print((' ').join(result))
  18.     else:
  19.         print(-1)
  20.             
  21.             
  22. if __name__=="__main__":
  23.     n,m = map(int, input().split())
  24.     degrees = [0]*n
  25.     depend = [[] for _ in range(n)]
  26.     for i in range(m):
  27.         a,b = map(int, input().split())
  28.         depend[a].append(b)
  29.         degrees[b]+=1
  30.     bfs(degrees)
复制代码
dijkstra(质朴版)精讲

  1. def dijkstra(graph, n):
  2.     min_dist = [float('inf')]*n
  3.     visited = [False]*n
  4.    
  5.     min_dist[0]=0
  6.     for i in range(n):
  7.         min_val = float('inf')
  8.         cur = -1
  9.         for j in range(n):
  10.             if not visited[j] and min_dist[j]<min_val:
  11.                 min_val = min_dist[j]
  12.                 cur = j
  13.         visited[cur]=True
  14.         
  15.         for k in range(n):
  16.             if not visited[j] and min_dist[cur]+graph[cur][k]<min_dist[k]:
  17.                 min_dist[k]=graph[cur][k]+min_dist[cur]
  18.    
  19.     if min_dist[-1] == float('inf'):
  20.         print(-1)
  21.     else:
  22.         print(min_dist[-1])
  23.         
  24. if __name__=='__main__':
  25.     n,m = map(int, input().split())
  26.     graph = [[float('inf')]*n for _ in range(n)]
  27.     for i in range(m):
  28.         s,e,v = map(int, input().split())
  29.         graph[s-1][e-1]=v
  30.    
  31.     dijkstra(graph, n)  
复制代码
prim和dijkstra的区别



  • prim是求非访问节点到最小生成树的最小距离,而dijkstra是求非访问节点到源点的最小距离。
  • prim算法可以有负权值,dijkstra算法不可以有负权值
  • prim 更新 minDist数组的写法:
  1. for (int j = 1; j <= v; j++) {
  2.     if (!isInTree[j] && grid[cur][j] < minDist[j]) {
  3.         minDist[j] = grid[cur][j];
  4.     }
  5. }
复制代码


  • dijkstra 更新 minDist数组的写法:
  1. for (int v = 1; v <= n; v++) {
  2.     if (!visited[v] && grid[cur][v] != INT_MAX && minDist[cur] + grid[cur][v] < minDist[v]) {
  3.         minDist[v] = minDist[cur] + grid[cur][v];
  4.     }
  5. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

自由的羽毛

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表