def dfs(u):
#如果已经培育出来了且不是初始就有的,直接返回培育的天数
if f[u]:return f[u]
#如果len(f[u]) == 0,则说明是初始就有的种子,则直接返回0,不用处理
L=len(s[u])
if L==0:return 0
#以上都不是,则是需要培育的种子
f[u]=int(2e9)
for i in range(0,L,2):#会存在两个不同的方案生成同一个编号的种子,例如42 32 14 ,4 31 14,此时s[14] = [42,32,4,31]
f[u]=min(f[u],max(dfs(s[u][i]),dfs(s[u][i+1]))+max(t[s[u][i]-1],t[s[u][i+1]-1]))
return f[u]
#map高阶函数介绍参考:https://blog.csdn.net/m0_37882192/article/details/115328761
n,m,k,tar=map(int,input().split())
t=list(map(int,input().split()))
s=[]
f=[]
for i in range(n+1):
s.append([])
f.append(0)
a=list(map(int,input().split()))
#将所有能培育C编号的种子入列表,
#表示培育方案有k种,即需要处理k行
while k:
k-=1
#如42 32 14 ,4 31 14,则s[C] = [A1,B1,A2,B2],即s[14] = [42,32,4,31],表示有两个方案能培育出14编号种子
A,B,C=map(int,input().split())
s[C].append(A)
s[C].append(B)
print(dfs(tar))
#test 1
# 6 2 4 6
# 5 3 4 6 4 9
# 1 2
# 1 2 3
# 1 3 4
# 2 3 5
# 4 5 6
思路来源:
蓝桥杯官网 试题 PREV-230 历届真题 作物杂交【第十一届】【决赛】【研究生组】【C++】【C】【Java】【Python】四种解法_mb618d1c8a55b34的技术博客_51CTO博客