Dijkstra:
#Dijkstra算法只能解决有向无负权图单源最短路径
#其基本思想是每次找出距离已经访问过的集合最短边连接的点,以该点为基准进行松弛
#Dijkstra算法只能解决有向无负权图单源最短路径
#其基本思想是每次找出距离已经访问过的集合最短边连接的点,以该点为基准进行松弛
import time
begin=time.clock()
juzhen=[
[0,4,2,5,999,999,999,999,999,999],
[999,0,999,999,7,5,999,999,999,999],
[999,999,0,999,999,9,999,999,999,999],
[999,999,999,0,2,999,7,999,999,999],
[999,999,999,999,0,999,999,4,999,999],
[999,999,999,999,999,0,999,999,999,6],
[999,999,999,999,999,999,0,999,3,999],
[999,999,999,999,999,999,999,0,999,7],
[999,999,999,999,999,999,999,999,0,8],
[999,999,999,999,999,999,999,999,999,0]
]
distance=[0 for i in range(10)]#共有十个顶点,表示每个顶点到源点的距离
used=[0 for i in range(10)]#记录是否已经求得最短路径(将所有的初始化为0)
used[0]=1#本身已经求得最短路径0
for i in range(10): #初始化原始距离
distance[i]=juzhen[0][i]
for i in range(1,10): #每次找一个距离“源点”最近的点
k=1
min=999 #999代表无穷大,用其代表没路可走
for j in range(10): #每次找到距离以标记集合中的最短的点
if(used[j]==0 and distance[j]<min):
min=distance[j] #找到该点,标记它
k=j
used[k]=1
for w in range(10): #以找到的点为中心,“松弛其他点到源点的最短距离”
if(used[w]==0 and min+juzhen[k][w]<distance[w]):
distance[w]=min+juzhen[k][w]
end=time.clock()
for i in range(10):
print(distance[i])
print(end-begin)
Bellman-Ford算法:
#Ford算法可以用于解决有向图无向图以及负边权图
#其基本思想是首先将除了源节点之外到源节点的距离设置为无穷大,本身设置成0,依次访问n-1个点,以该点为基准进行松弛
import time
begin=time.clock()
juzhen=[
[0,4,2,5,999,999,999,999,999,999],
[999,0,999,999,7,5,999,999,999,999],
[999,999,0,999,999,9,999,999,999,999],
[999,999,999,0,2,999,7,999,999,999],
[999,999,999,999,0,999,999,4,999,999],
[999,999,999,999,999,0,999,999,999,6],
[999,999,999,999,999,999,0,999,3,999],
[999,999,999,999,999,999,999,0,999,7],
[999,999,999,999,999,999,999,999,0,8],
[999,999,999,999,999,999,999,999,999,0]
]
isornotfuquanhuilu=0
distance=[999 for i in range(10)]
distance[0]=0
for i in range(10):
for j in range(10):
if(distance[i]!=999 and distance[i]+juzhen[i][j]<distance[j]):
distance[j]=distance[i]+juzhen[i][j]
for i in range(10):
for j in range(10):
if(distance[i]!=999 and distance[i]+juzhen[i][j]<distance[j]):
isornotfuquanhuilu=1
end=time.clock()
if isornotfuquanhuilu==1:
print("存在负权回路")
else:
for i in range(10):
print(distance[i])
print(end-begin)
spfa算法:(分支界限法求最短路径)
"""
Spfa算法是Bellman-Ford算法的优化版本
只有那些在前一遍松弛中改变了距离估计值的点,才可能引起他们的邻接点的距离估计值的改变。
"""
import time
begin=time.clock()
juzhen=[
[0,4,2,5,999,999,999,999,999,999],
[999,0,999,999,7,5,999,999,999,999],
[999,999,0,999,999,9,999,999,999,999],
[999,999,999,0,2,999,7,999,999,999],
[999,999,999,999,0,999,999,4,999,999],
[999,999,999,999,999,0,999,999,999,6],
[999,999,999,999,999,999,0,999,3,999],
[999,999,999,999,999,999,999,0,999,7],
[999,999,999,999,999,999,999,999,0,8],
[999,999,999,999,999,999,999,999,999,0]
]
distance=[999 for i in range(10)]
used=[0 for i in range(10)]
q=[0 for i in range(1000)]
distance[0]=0
used[0]=1
head=0
tail=1
q[tail]=0
while(head<tail):
head+=1
v=q[head]
used[v]=0
for i in range(10):
if(distance[i]>distance[v]+juzhen[v][i]):
distance[i]=distance[v]+juzhen[v][i]
if(used[i]==0):
tail+=1
q[tail]=i
used[i]=1
end=time.clock()
for i in range(10):
print(distance[i])
print(end-begin)