当前位置: 首页> 文旅> 艺术 > 代码随想录算法训练营DAY64|拓扑排序、dijkstra(朴素版)

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

时间:2025/7/10 0:22:07来源:https://blog.csdn.net/Greeneril_/article/details/140660015 浏览次数:0次

拓扑排序精讲

from collections import dequedef bfs(degrees):nodes = deque()for j in range(n):if degrees[j]==0:nodes.append(j)result = []        while nodes:idx = nodes.popleft()result.append(str(idx))if depend[idx]:for file in depend[idx]:degrees[file]-=1if degrees[file]==0:nodes.append(file)if len(result)==n:print((' ').join(result))else:print(-1)if __name__=="__main__":n,m = map(int, input().split())degrees = [0]*ndepend = [[] for _ in range(n)]for i in range(m):a,b = map(int, input().split())depend[a].append(b)degrees[b]+=1bfs(degrees)

dijkstra(朴素版)精讲

def dijkstra(graph, n):min_dist = [float('inf')]*nvisited = [False]*nmin_dist[0]=0for i in range(n):min_val = float('inf')cur = -1for j in range(n):if not visited[j] and min_dist[j]<min_val:min_val = min_dist[j]cur = jvisited[cur]=Truefor k in range(n):if not visited[j] and min_dist[cur]+graph[cur][k]<min_dist[k]:min_dist[k]=graph[cur][k]+min_dist[cur]if min_dist[-1] == float('inf'):print(-1)else:print(min_dist[-1])if __name__=='__main__':n,m = map(int, input().split())graph = [[float('inf')]*n for _ in range(n)]for i in range(m):s,e,v = map(int, input().split())graph[s-1][e-1]=vdijkstra(graph, n)  

prim和dijkstra的区别

  • prim是求非访问节点到最小生成树的最小距离,而dijkstra是求非访问节点到源点的最小距离。
  • prim算法可以有负权值,dijkstra算法不可以有负权值
  • prim 更新 minDist数组的写法:
for (int j = 1; j <= v; j++) {if (!isInTree[j] && grid[cur][j] < minDist[j]) {minDist[j] = grid[cur][j];}
}
  • dijkstra 更新 minDist数组的写法:
for (int v = 1; v <= n; v++) {if (!visited[v] && grid[cur][v] != INT_MAX && minDist[cur] + grid[cur][v] < minDist[v]) {minDist[v] = minDist[cur] + grid[cur][v];}
}
关键字:代码随想录算法训练营DAY64|拓扑排序、dijkstra(朴素版)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: