蓝桥杯2020年第十一届省赛真题-作物杂交 - C语言网
参考于蓝桥杯 作物杂交 python_Fish_1575的博客-CSDN博客
n,m,k,t=map(int,input().split())
plant_grow_time=[0]#为了方便理解,将0号植物的位置留出
plant_grow_time+=list(map(int,input().split()))# i号植物生长的时间
min_grow_time=[float('inf')]*(n+1) # i号植物成熟的最小所需时间
have_plant=[False]*(n+1) # 是否已经计算过i号植物的所需时间
for i in map(int,input().split()):
min_grow_time[i]=0 #获得初始给的种子的时间为0
have_plant[i]=True # 标记为已经计算过
plans={}
for i in range(k):
a,b,c=map(int,input().split()) # 两个子节点和i号植物
if c not in plans:# 如果原来的杂交方案里没有得到i号植物的方案
plans[c]=[] # 初始化方案列表,可能有多个方案得到i号植物,所以设为列表
plans[c].append([a,b])
# 测试案例plans为: {3: [[1, 2]], 4: [[1, 3]], 5: [[2, 3]], 6: [[4, 5]]}
def dfs(now_plant):
if have_plant[now_plant]:
return min_grow_time[now_plant]
for plan in plans[now_plant]:
plant_new_time=max(dfs(plan[0]),dfs(plan[1]))+max(plant_grow_time[plan[0]],plant_grow_time[plan[1]])
min_grow_time[now_plant]=min(min_grow_time[now_plant],plant_new_time)
have_plant[now_plant]=True
return min_grow_time[now_plant]
dfs(t)
print(min_grow_time[t])
def dfs(now_plant):
if have_plant[now_plant]:
return min_grow_time[now_plant]
for plan in plans[now_plant]:#多分枝子树用列表存储及遍历
plant_new_time=max(dfs(plan[0]),dfs(plan[1]))+max(plant_grow_time[plan[0]],plant_grow_time[plan[1]])#不是最终值,需要进行比较
#以下三行都是重点!!!
min_grow_time[now_plant]=min(min_grow_time[now_plant],plant_new_time)#将其填入最少时间列表中
#for循环完后,说明当前植物的所有分枝全部比较完,并得到该种子,对其赋值True
have_plant[now_plant]=True
#并返回其最小值min_grow_time[now_plant]
return min_grow_time[now_plant]
if __name__ == '__main__':
n,m,k,t=map(int,input().split())
plant_grow_time=[0]#为了方便理解,将0号植物的位置留出
plant_grow_time+=list(map(int,input().split()))# i号植物生长的时间
min_grow_time=[float('inf')]*(n+1) # i号植物成熟的最小所需时间
have_plant=[False]*(n+1) # 是否已经计算过i号植物的所需时间
for i in map(int,input().split()):
min_grow_time[i]=0 #获得初始给的种子的时间为0
have_plant[i]=True # 标记为已经计算过
plans={}
for i in range(k):
a,b,c=map(int,input().split()) # 两个子节点和i号植物
if c not in plans:# 如果原来的杂交方案里没有得到i号植物的方案
plans[c]=[] # 初始化方案列表,可能有多个方案得到i号植物,所以设为列表
plans[c].append([a,b])
# 测试案例plans为: {3: [[1, 2]], 4: [[1, 3]], 5: [[2, 3]], 6: [[4, 5]]}
dfs(t)
print(min_grow_time[t])
精简版
#作物杂交
n,m,k,t=map(int,input().split())
T=list(map(int,input().split()))
K=list(map(int,input().split()))
mix=[[] for i in range(n+1)]
for i in range(k):
a,b,c=map(int,input().split())
max_time=max(T[a-1],T[b-1])
ls=[a,b,max_time]
mix[c].append(ls)
dp=[float("inf") for i in range(n+1)]
for i in K:
dp[i]=0
def dfs(i):
if dp[i]!=float("inf"):
return dp[i]
for j in range(len(mix[i])):
dp[i]=min(dp[i],max(dfs(mix[i][j][0]),dfs(mix[i][j][1]))+mix[i][j][2])
return dp[i]
print(dfs(t))
最后
以上就是体贴饼干最近收集整理的关于【DFS题型六/反向DFS】作物杂交的全部内容,更多相关【DFS题型六/反向DFS】作物杂交内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复