最短路径:单源多源
参考书籍:大话数据结构
0. 基本概念
- 简介:求解点到点的最短的路径
- 图示:
1. Dijkstra算法:单源最短路径
- 基本概念:求解源点到其余节点的最短距离。
- 算法描述:每一次求解的都是到源点的最近的节点。所以不会存在其他点比这个点更近。
- 算法:
- 单源最短路径算法实现(python):
import Graph_Adj_Matrix as GAM
import copy
MAX = 100
# 单源最短节点
def dijkstras(G, v0):
'''
直接通过每一次都是最近的节点,表示的是从顶点v0出发的最短的节点
:param G:
:return:
'''
distance = copy.deepcopy(G.edges[v0])
parent = [0] * G.vertexs_num
final = [0] * G.vertexs_num
distance[v0] = 0
final[v0] = 1
k = v0
# 开始循环,寻找最近的顶点
for i in range(G.vertexs_num):
MIN = MAX
for j in range(G.vertexs_num):
if final[j] == 0 and distance[j] < MIN:
k = j # 记录最小位置
MIN = distance[j]
final[k] = 1
for j in range(G.vertexs_num):
if final[j] == 0 and MIN + G.edges[k][j] < distance[j]:
distance[j] = MIN + G.edges[k][j]
parent[j] = k # 表示的k为j的前一个节点
return parent
- 算法结果:
2.Foleyed算法:多源最短路径
- 基本概念:求图中的每一个节点到别的节点之间的距离
- 算法描述:实际上就是一个DP算法,求解的就是每一个点到另外一个点之间的最短路径。通另外一个矩阵记录路径,主要的方式为就是相当于记住的是当前这个点的前一个节点。之后会直接利用这个矩阵找到多源的最短路径。DP[i][j]=min(Matr[i][j],Matrix[i][k]+Matrix[k][j])。Floyd算法的相关证明
- 算法:
- 算法代码:
def floyed(G):
'''
多源最短路径,实际上就是一个DP
DP[i][j]=min(G[i,j],G[i][k]+G[k][j])
:param G:
:return:
'''
path = [list(range(G.vertexs_num)) for _ in range(G.vertexs_num)]
matrix = copy.deepcopy(G.edges) # 注意可变对象
for k in range(G.vertexs_num): # 表示的是中转
for i in range(G.vertexs_num):
for j in range(G.vertexs_num):
if i==j:
matrix[i][j]=0
elif matrix[i][j] > matrix[i][k] + matrix[k][j]:
matrix[i][j] = matrix[i][k] + matrix[k][j]
path[i][j] = path[i][k] # 表示先到k再到j
print('\n' + '-' * 20 + 'Floyed的多源最短路径权值为:' + '-' * 20,end='')
for row in range(G.vertexs_num):
print(end='\n')
for col in range(G.vertexs_num):
print('{0:5}'.format(matrix[row][col]), end='')
print('\n' + '-' * 20 + 'Floyed的多源最短路径为:' + '-' * 20,end='')
for row in range(G.vertexs_num):
print(end='\n')
for col in range(G.vertexs_num):
print('{0:5}'.format(path[row][col]), end='')
return path, matrix
- 算法结果: