马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
拓扑排序精讲
- from collections import deque
- def 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]-=1
- if 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]*n
- depend = [[] for _ in range(n)]
- for i in range(m):
- a,b = map(int, input().split())
- depend[a].append(b)
- degrees[b]+=1
- bfs(degrees)
复制代码 dijkstra(质朴版)精讲
- def dijkstra(graph, n):
- min_dist = [float('inf')]*n
- visited = [False]*n
-
- min_dist[0]=0
- for i in range(n):
- min_val = float('inf')
- cur = -1
- for j in range(n):
- if not visited[j] and min_dist[j]<min_val:
- min_val = min_dist[j]
- cur = j
- visited[cur]=True
-
- for 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]=v
-
- dijkstra(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];
- }
- }
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |