PAT 甲级(Python) #1003 Emergency (25 分)

#1003 Emergency (25 分)

在这里插入图片描述
在这里插入图片描述
首先实现但源最短路径算法,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)

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值