无权图-BFS
graph = {
1:[2,4],
2:[4,5],
3:[1,6],
4:[3,5,6,7],
5:[7],
6:[],
7:[6],
}
from collections import deque
dist = {}
path = {}
def bfs(graph,start):
search = deque()
search.append(start)
path[start] = 0
dist[start] = 0
while search:
cur =search.popleft()
for node in graph[cur]:
if dist.get(node) is None:
dist[node] = dist[cur] + 1
path[node] = cur
search.append(node)
bfs(graph,3)
print('Path:')
print(path)
print('Distance:')
print(dist)
Path:
{3: 0, 1: 3, 6: 3, 2: 1, 4: 1, 5: 2, 7: 4}
Distance:
{3: 0, 1: 1, 6: 1, 2: 2, 4: 2, 5: 3, 7: 3}
有权图-Dijkstra算法
graph = {
1:{2:2,4:1},
2:{5:10,4:3},
3:{1:4,6:5},
4:{3:2,6:8,7:4,5:2},
5:{7:6},
6:{},
7:{6:1},
}
def shortest_path(graph,dist,visited):
MinDist = float('inf')
for node in graph:
if node not in visited and dist[node] < MinDist:
MinDist = dist.get(node)
MinNode = node
if MinDist < float('inf'):
return MinNode
else:
return None
def Dijkstra(graph,start):
global visited,path,dist
visited = set()
path = {}
dist = {}
for node in graph:
dist[node] = graph[start].get(node, float('inf'))
if dist[node] < float('inf'):
path[node] = start
visited.add(start)
dist[start] = 0
path[start] = -1
while True:
min_node = shortest_path(graph,dist,visited)
if min_node is None:
break
visited.add(min_node)
for node in graph:
if node not in visited and node in graph[min_node]:
if graph[min_node][node] < 0:
return False
if dist[min_node] + graph[min_node].get(node,float('inf')) < dist[node]:
dist[node] = dist[min_node] + graph[min_node].get(node,float('inf'))
path[node] = min_node
return True
print(Dijkstra(graph,1))
print('path',path)
print('dist',dist)
True
path {2: 1, 4: 1, 1: -1, 3: 4, 5: 4, 6: 7, 7: 4}
dist {1: 0, 2: 2, 3: 3, 4: 1, 5: 3, 6: 6, 7: 5}