# 输入数据
line =input().strip().split()
c, n, s, m =[int(x)for x in line]
line =input().strip().split()
bikes =[float('inf')]for i inrange(len(line)):
bikes.append(int(line[i])- c /2)
roads =[{}for _ inrange(n +1)]for i inrange(m):
line =input().strip().split()
a, b, c =[int(x)for x in line]
roads[a][b]= roads[b][a]= c
travseral =[Falsefor _ inrange(n +1)]
distance =[float('inf')for _ inrange(n +1)]
travseral[0]=True
distance[0]=0
pre_points =[[]for _ inrange(n +1)]# 前驱节点
path =[]
temp_path =[]
min_need =float('inf')
min_back =float('inf')# —————————————————————进入DFS核心代码—————————————————————defDFS(v:int):global min_need
global min_back
global path
global temp_path
temp_path.append(v)if v ==0:
need =0
back =0# 打白条
temp = temp_path[0:len(temp_path)-1]
temp.reverse()for each in temp:if bikes[each]>0:# 如果该站点的自行车多余
back += bikes[each]elif back >-bikes[each]:# 如果带回去的自行车能够填补该站点
back += bikes[each]else:
need +=-back - bikes[each]
back =0if need < min_need:
min_need = need
min_back = back
path = temp_path[0:]elif need == min_need and back < min_back:
min_back = back
path = temp_path
else:pass
temp_path.pop()else:for each in pre_points[v]:
DFS(each)
temp_path.pop()# —————————————————————结束DFS核心代码—————————————————————defmain():# ————————————————————进入Dijkstra核心代码————————————————————# dijkstra算法,每次添加一个bike stationfor _ inrange(n):
min_distance =float('inf')
station =-1# 添加的车站
temp_pre =[]# 添加的路径for j inrange(n +1):if travseral[j]:# 该点已经被遍历for h inrange(n +1):ifnot travseral[h]:
temp =intif j == h:
temp =0elif h notin roads[j]:
temp =float('inf')elif h in roads[j]:
temp = roads[j][h]else:passif distance[j]+ temp < min_distance:
min_distance = distance[j]+ temp
station = h
temp_pre =[j]elif distance[j]+ temp == min_distance and station == h:
temp_pre.append(j)
pre_points[station]= temp_pre
distance[station]= min_distance
travseral[station]=True# ————————————————————结束Dijkstra核心代码————————————————————
DFS(s)
path.reverse()print(int(min_need),'->'.join(str(x)for x in path),int(min_back))if __name__ =='__main__':
main()
PAT (Advanced Level) Practice 1018 Public Bike Management(Python)## 未AC,测试点7错误,测试点9超时。
原题传送门代码# 输入数据line = input().strip().split()c, n, s, m = [int(x) for x in line]line = input().strip().split()bikes = [float('inf')]for i in range(len(line)): bikes.append(int(line[i]) - c / 2)roads = [{} for _ in range(n + 1)]for i in range(m):