1 true question
Title Description
Crop hybridization is an important step in crop cultivation. There are known n crops (No. 1 to n), and the time from sowing to maturity of the ith crop is Ti. Crops can be hybridized in pairs, and the longer of the two kinds of time is taken as the hybridization time. If the planting time of crop A is 5 days and that of crop B is 7 days, the time of AB hybridization is 7 days. Crop hybridization will produce fixed crops, and the newly produced crops still belong to one of N crops.
At the beginning, there are seeds of M crops (unlimited quantity, which can support multiple crosses). Multiple hybridization processes can be carried out at the same time. Ask how many days it takes to get a given target seed.
If there are four kinds of crops ABCD, their maturity time is 5 days, 7 days, 3 days and 8 days. Initially, there are seeds of AB crops, the target seed is D, and the known hybridization condition is a × B → C,A × C → D. The shortest hybridization process is:
Day 1 to 7 (time of crop b), A × B → C.
Day 8 to 12 (time of crop A), A × C → D.
It takes 12 days to get the seeds of crop D.
Enter description
The first line of the input contains four integers, N, M, K, T, n represents the total number of crop species (numbers 1 to N), M represents the number of crop seed types initially owned, K represents the number of schemes that can be hybridized, and T represents the number of target seeds.
The second line contains N integers, where the ith integer represents the planting time ti of the ith crop (1 < = Ti < = 100)
The third line contains M integers, which respectively represent the seed type Kj (1 < = Kj ≤ M), and Kj is different.
Lines 4 to K+ 3, each line contains three integers A, B and C, indicating that the seeds of category C crops can be obtained by crossing category A crops and category B crops.
Where n < = 1, n < = 1, n < = 1, n < = 2
Ensure that the target seed can be obtained by hybridization.
Output description
Output an integer indicating the shortest hybridization time to obtain the target seed.
sample input
6 2 4 6 5 3 4 6 4 9 1 2 1 2 3 1 3 4 2 3 5 4 5 6
sample output
16
Example description
From day 1 to day 5, the crops No. 1 and No. 2 were hybridized to obtain the crop seeds No. 3.
From day 6 to day 10, the crops No. 1 and No. 3 were hybridized to obtain the crop seeds No. 4.
From day 6 to day 9, the crops No. 2 and No. 3 were hybridized to obtain the crop seeds No. 5.
From day 11 to day 16, the crops No. 4 and No. 5 were hybridized to obtain the crop seeds No. 6.
It takes 16 days in total.
2 Analysis
Degree of Difficulty: ⭐⭐⭐
Investigation question type: graph theory dynamic programming
Knowledge points involved: DFS DP
Train of thought analysis:
Step 1: review the questions. I watched this topic for 10 minutes before I knew exactly what crop hybridization was doing.
Step 2: input. Input various conditions in the title. It is better to write sample input next to it, which is more convenient to understand and will not be dizzy.
Step 3: search. Recurs the known crop from the target crop and write a dfs function.
3 code
Detailed annotation version
#Crop hybridization dfs n,m,k,t=map(int,input().split())#n: Seed number - Category 6 m: initial seed number - 2 k: hybridization scheme - 4 species t: target seed number - 6 T=list(map(int,input().split()))#Planting time T=[5,3,4,6,4,9] M=list(map(int,input().split()))#Owned seed type M=[1,2] mix=[[] for i in range(n+1)]#The hybridization list is initialized to 0 for i in range(k):#Input 4 hybridization schemes temp1,temp2,temp3=map(int,input().split())#Hybridization scheme#1+2→3 #1+3→4 #2+3→5 #4+5→6 temp=max(T[temp1-1],T[temp2-1])#Maximum hybridization time#5 5 4 6 mix[temp3].append([temp1,temp2,temp])#[1,2,5] [1,3,5] [2,3,4] [4,5,6] #mix=[[], [], [], [[1, 2, 5]], [[1, 3, 5]], [[2, 3, 4]], [[4, 5, 6]]] #[[[], [], []]] this format is because there may be multiple hybridization schemes for a crop f=[100000 for i in range(n+1)]#Maximum initialization time of crop culture for i in M:#Initializing the existing seed culture time is 0 f[i]=0 #f=[0,0,0,100000,100000,100000···] def dfs(get):#Time required to obtain the target crop if f[get]!=100000:#The calculated crop is returned directly return f[get] for i in range(len(mix[get])):#Traverse all hybridization schemes of a crop f[get]=min(f[get],max(dfs(mix[get][i][0]),dfs(mix[get][i][1]))+mix[get][i][2]) #f[6]=min(100000,max(dfs(4),dfs(5))+6h)=16h #f[5]=min(100000,max(dfs(2),dfs(3))+4h)=9h #f[4]=min(100000,max(dfs(1),dfs(3))+5h)=10h #f[3]=min(100000,max(dfs(1),dfs(2))+5h)=5h #dfs(1)=0 #dfs(2)=0 return f[get] print(dfs(t))#dfs(6)
Reduced code version
n,m,k,t=map(int,input().split()) T=list(map(int,input().split())) M=list(map(int,input().split())) mix=[[] for i in range(n+1)] for i in range(k): temp1,temp2,temp3=map(int,input().split()) temp=max(T[temp1-1],T[temp2-1]) ls=[temp1,temp2,temp] mix[temp3].append(ls) f=[100000 for i in range(n+1)] for i in M: f[i]=0 def dfs(get): if f[get]!=100000: return f[get] for i in range(len(mix[get])): f[get]=min(f[get],max(dfs(mix[get][i][0]),dfs(mix[get][i][1]))+mix[get][i][2]) return f[get] print(dfs(t))