题解
#include <iostream>
#include <vector>
#include <climits>
using namespace std;
const int n = 2001;
int time_[n];// 种植时间
bool have[n];// 已有的作物种类
vector<pair<int, int>> ways[n];// 得到 i 方案
int lowestTime[n];// 最短的种植时间
int dfs(int target) {
if (have[target]) {// 已有则直接返回
return lowestTime[target];
}
int n = ways[target].size();
for (int i = 0; i < n; i++) {// 遍历方案
int a = ways[target][i].first, b = ways[target][i].second;
if (!have[a]) {
dfs(a);// 没有 a 则去得到 a
}
if (!have[b]) {
dfs(b);// 同 a
}
if (have[a] && have[b]) {
have[target] = true;// 标记已有
// 目标作物的最短种植时间为 a 与 b 进行杂交得到目标作物的时间 + 得到 a 的最短时间和得到 b 的最短时间两者的最大值
// 以保证时间最短
lowestTime[target] = min(lowestTime[target], max(time_[a], time_[b]) + max(lowestTime[a], lowestTime[b]));
}
}
return lowestTime[target];
}
int main() {
/*
N: 作物种类数
M: 已有的作物种类数
K: 杂交方案数
T: 目标作物
*/
int N, M, K, T;
cin >> N >> M >> K >> T;
for (int i = 1; i <= N; i++) {
cin >> time_[i];// 时间
lowestTime[i] = INT_MAX;// 设为最大值,后续的比较
}
for (int i = 1; i <= M; i++) {
int temp;
cin >> temp;
have[temp] = true;// 标记为已有
lowestTime[temp] = 0;// 已有的作物最短种植时间为 0
}
for (int i = 1; i <= K; i++) {
int a, b, c;// 方案
cin >> a >> b >> c;
ways[c].push_back({a, b});// 得到作物 c 的方案
}
cout << dfs(T);// 递归
return 0;
}