PAT-Practice 1003 Emergency (Python)

set_city={} 
#每个站点可连接的其他站点序号及路径成本(采用字典(存每个站点)里存储字典(存连接至哪个站点的路径需要的时间))
result=[] #可能的路径
min_result=0 #当前存储的可能路径中的移动最小时间,利用这个数值对大于该时间的路径直接忽略,减少大量计算时间
def toint(lis):
    for i in range(len(lis)):
        lis[i]=int(lis[i])
    return lis

def depth(start,end,path=[]): #深度优先搜索
    #print('%d'%(start),end='')
    #print(path)
    path.append(start)  #将start点加入路径
    
    global min_result   
    a = 0
    for j in range(len(path) - 1):
        a += set_city[path[j]][path[j + 1]]
    if a>min_result:    #判断是否该路径可以被忽视
        return
    if start==end:      #判断是否已经找到终点
        result.append(path)
        a = 0
        for j in range(len(path) - 1):
            a+=set_city[path[j]][path[j+1]]
        if a<min_result:
            min_result=a
        #print('发现可用路径',end='')
        #print(path)
        return
    
    a=list(set_city[start].keys())  #列出当前点对应的字典的所有key
    a=toint(a)
    #print('%d:'%start,end='')
    #print(len(a))
    for i in range(len(a)):         #深入
        if a[i] not in path:
            path_copy = path.copy()
            #print('%d 层进入 %d '%(start,a[i][0]))
            depth(a[i],end,path_copy)



a=input()
a=a.split(' ')
a=toint(a)

value=input() #站点价值
value=value.split(' ')
value=toint(value)
for i in range(a[0]):
    set_city[i]={}



for i in range(a[1]):   #构建字典
    j=input()
    j=j.split(' ')
    j=toint(j)
    set_city[j[0]][j[1]]=j[2]
    set_city[j[1]][j[0]]=j[2]
    min_result+=j[2]


#print(value)
depth(a[2],a[3])
#print(result)
fine=[]
#print(set_city)
for i in range(len(result)):    #找到可能的路径result中每条路径的花费时间
    a=0
    for j in range(len(result[i])-1):
        a+=set_city[result[i][j]][result[i][j+1]]
    fine.append(a)
#print(fine)
ma=min(fine)    
num=0
max_value=0
for i in range(len(fine)):  #得到相同最小时间花费的路径中的最大站点value和
    if fine[i]==ma:
        num+=1
        max_v=0
        for j in range(len(result[i])):
            max_v+=value[result[i][j]]
        if max_v>max_value:
            max_value=max_v
print('%d %d'%(num,max_value))

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值