首先实现但源最短路径算法,Dijkstra算法:
N, M, city_src, city_dst = list(map(int,input().split()))
# print("N =", N)
# print("M =", M)
# print("city_src =", city_src)
# print("city_dst =", city_dst)
team_num = list(map(int,input().split()))
# print("team_num =", team_num)
MAX_LEN = 10000000000
adjacent = [[None]*N for i in range(N)]
for i in range(M):
a, b, L = list(map(eval,input().split()))
adjacent[a][b] = adjacent[b][a] = L
# print("adjacent = :")
# for item in adjacent:
# print(item)
ShortPathEst = adjacent[city_src][:] # shortest path estimation
SourceSet = set([city_src]) #
ResidualSet = set([i for i in range(N) if i != city_src]) #
def getMinFromResidual():
min_index = -1
min_cost = MAX_LEN
for index in ResidualSet:
if ShortPathEst[index] != None and ShortPathEst[index]<min_cost:
min_cost, min_index = ShortPathEst[index], index
return min_index, min_cost
def relaxToSourceSet(min_city):
for index in ResidualSet:
if adjacent[min_city][index]!=None:
if ShortPathEst[index] == None or ShortPathEst[index]>ShortPathEst[min_city]+adjacent[min_city][index]:
ShortPathEst[index] = ShortPathEst[min_city]+adjacent[min_city][index]
while city_dst in ResidualSet:
min_city, min_path = getMinFromResidual()
SourceSet.add(min_city)
ResidualSet.remove(min_city)
relaxToSourceSet(min_city)
print("最短路径是:",ShortPathEst[city_dst])
添加功能,收集各个终点的直接前驱:
N, M, city_src, city_dst = list(map(int,input().split()))
team_num = list(map(int,input().split()))
# print("team_num =", team_num)
MAX_LEN = 10000000000
adjacent = [[None]*N for i in range(N)]
for i in range(M):
a, b, L = list(map(eval,input().split()))
adjacent[a][b] = adjacent[b][a] = L
for i in range(N):
adjacent[i][i] = 0
# 用于记录到达每个终点所需要经过的直接前驱
# 因为最短路径不一定唯一,故直接前驱可能不止一个,
# 也可能不存在最短路径因而不存在直接前驱
priors = [list() for i in range(N)]
ShortPathEst = adjacent[city_src][:] # shortest path estimation
SourceSet = set() #
ResidualSet = set([i for i in range(N)]) #
def getMinFromResidual():
min_index = -1
min_cost = MAX_LEN
for index in ResidualSet:
if ShortPathEst[index] != None and ShortPathEst[index]<min_cost:
min_cost, min_index = ShortPathEst[index], index
return min_index, min_cost
def relaxToSourceSet(min_city):
for index in ResidualSet:
if adjacent[min_city][index]!=None:
if ShortPathEst[index] == None:
ShortPathEst[index] = ShortPathEst[min_city]+adjacent[min_city][index]
priors[index] = [min_city]
elif ShortPathEst[index]>ShortPathEst[min_city]+adjacent[min_city][index]:
ShortPathEst[index] = ShortPathEst[min_city]+adjacent[min_city][index]
priors[index] = [min_city]
elif ShortPathEst[index] == ShortPathEst[min_city]+adjacent[min_city][index]:
(priors[index]).append(min_city)
# if ShortPathEst[index] == None or ShortPathEst[index]>ShortPathEst[min_city]+adjacent[min_city][index]:
# ShortPathEst[index] = ShortPathEst[min_city]+adjacent[min_city][index]
while city_dst in ResidualSet:
min_city, min_path = getMinFromResidual()
SourceSet.add(min_city)
ResidualSet.remove(min_city)
relaxToSourceSet(min_city)
print("最短路径是:",ShortPathEst[city_dst])
print('每个终点的直接前驱是:',priors)
获得救援队伍数量:
N, M, city_src, city_dst = list(map(int,input().split()))
team_num = list(map(int,input().split()))
# print("team_num =", team_num)
MAX_LEN = 10000000000
adjacent = [[None]*N for i in range(N)]
for i in range(M):
a, b, L = list(map(eval,input().split()))
adjacent[a][b] = adjacent[b][a] = L
for i in range(N):
adjacent[i][i] = 0
# 用于记录到达每个终点所需要经过的直接前驱
# 因为最短路径不一定唯一,故直接前驱可能不止一个,
# 也可能不存在最短路径因而不存在直接前驱
priors = [list() for i in range(N)]
ShortPathEst = adjacent[city_src][:] # shortest path estimation
SourceSet = set() #
ResidualSet = set([i for i in range(N)]) #
def getMinFromResidual():
min_index = -1
min_cost = MAX_LEN
for index in ResidualSet:
if ShortPathEst[index] != None and ShortPathEst[index]<min_cost:
min_cost, min_index = ShortPathEst[index], index
return min_index, min_cost
def relaxToSourceSet(min_city):
for index in ResidualSet:
if adjacent[min_city][index]!=None:
if ShortPathEst[index] == None:
ShortPathEst[index] = ShortPathEst[min_city]+adjacent[min_city][index]
priors[index] = [min_city]
elif ShortPathEst[index]>ShortPathEst[min_city]+adjacent[min_city][index]:
ShortPathEst[index] = ShortPathEst[min_city]+adjacent[min_city][index]
priors[index] = [min_city]
elif ShortPathEst[index] == ShortPathEst[min_city]+adjacent[min_city][index]:
(priors[index]).append(min_city)
# if ShortPathEst[index] == None or ShortPathEst[index]>ShortPathEst[min_city]+adjacent[min_city][index]:
# ShortPathEst[index] = ShortPathEst[min_city]+adjacent[min_city][index]
while city_dst in ResidualSet:
min_city, min_path = getMinFromResidual()
SourceSet.add(min_city)
ResidualSet.remove(min_city)
relaxToSourceSet(min_city)
print("最短路径是:",ShortPathEst[city_dst])
print('每个终点的直接前驱是:',priors)
all_priors = set()
def get_all_priors(city):
global all_priors
prs = priors[city]
for i in prs:
all_priors.add(i)
get_all_priors(i)
get_all_priors(city_dst)
print('所有前驱是:',all_priors)
rescue_team_num = team_num[city_dst]
for i in all_priors:
rescue_team_num += team_num[i]
print('救援队伍数量:',rescue_team_num)
部分正确:
N, M, city_src, city_dst = list(map(int,input().split()))
team_num = list(map(int,input().split()))
# print("team_num =", team_num)
MAX_LEN = 10000000000
adjacent = [[None]*N for i in range(N)]
for i in range(M):
a, b, L = list(map(eval,input().split()))
adjacent[a][b] = adjacent[b][a] = L
for i in range(N):
adjacent[i][i] = 0
if city_src==city_dst:
print(1,team_num[city_dst])
exit()
# 用于记录到达每个终点所需要经过的直接前驱
# 因为最短路径不一定唯一,故直接前驱可能不止一个,
# 也可能不存在最短路径因而不存在直接前驱
priors = [list() for i in range(N)]
Path_Num = [0 for i in range(N)]
Path_Num[city_src] = 1
ShortPathEst = adjacent[city_src][:] # shortest path estimation
SourceSet = set() # 源点集合
ResidualSet = set([i for i in range(N)]) # 剩余点构成的集合
def getMinFromResidual():
'''# 找出剩余集合中到源点最近的城市以及对应路径长度'''
min_index = -1
min_cost = MAX_LEN
for index in ResidualSet:
if ShortPathEst[index] != None and ShortPathEst[index]<min_cost:
min_cost, min_index = ShortPathEst[index], index
return min_index, min_cost
def relaxToSourceSet(min_city):
for index in ResidualSet:
if adjacent[min_city][index]!=None:
if ShortPathEst[index] == None:
ShortPathEst[index] = ShortPathEst[min_city]+adjacent[min_city][index]
priors[index] = [min_city]
Path_Num[index] = Path_Num[min_city]
elif ShortPathEst[index]>ShortPathEst[min_city]+adjacent[min_city][index]:
ShortPathEst[index] = ShortPathEst[min_city]+adjacent[min_city][index]
priors[index] = [min_city]
Path_Num[index] = Path_Num[min_city]
elif ShortPathEst[index] == ShortPathEst[min_city]+adjacent[min_city][index]:
(priors[index]).append(min_city)
Path_Num[index] += Path_Num[min_city] ####################
while city_dst in ResidualSet:
min_city, min_path = getMinFromResidual()
SourceSet.add(min_city) # 将该城市添加到源点集合
ResidualSet.remove(min_city) # 将该城市从剩余集合中剔除
relaxToSourceSet(min_city)
# print("最短路径是:",ShortPathEst[city_dst])
# print('每个终点的直接前驱是:',priors)
all_priors = set()
def get_all_priors(city):
global all_priors
prs = priors[city]
for i in prs:
all_priors.add(i)
get_all_priors(i)
get_all_priors(city_dst)
# print('所有前驱是:',all_priors)
rescue_team_num = team_num[city_dst]
for i in all_priors:
rescue_team_num += team_num[i]
# print('救援队伍数量:',rescue_team_num)
# print('最短路径的数量:',Path_Num[city_dst])
print(Path_Num[city_dst],rescue_team_num)