总结:
const int maxn = 0x3f3f3f3f; 设置为int的最大值
思路:动态规划
状态转移方程:dp[n] = min(dp[n], max(f(a), f(b)) + max(tim[a], tim[b]));
#include <bits/stdc++.h>
using namespace std;
/*
6 2 4 6
5 3 4 6 4 9
1 2
1 2 3
1 3 4
2 3 5
4 5 6
*/
const int maxn = 0x3f3f3f3f;
int tim[2010];
int dp[2010]; //最少 dp[i]时间得到i种子
vector<pair<int, int> > zajiao[2010];
int f(int n){
if (dp[n] != maxn) return dp[n];
for (int i = 0; i < zajiao[n].size(); ++i){
int a = zajiao[n][i].first, b = zajiao[n][i].second;
int tmp = max(f(a), f(b)) + max(tim[a], tim[b]);
dp[n] = min(dp[n], tmp);
}
return dp[n];
}
int main(){
//ifstream in("1.txt");
for (int i = 0; i < 2010; i++){
dp[i] = maxn;
}
int n, m, k, t;
cin >> n >> m >> k >> t;
for (int i = 1; i <= n; ++i){
cin >> tim[i];
}
for (int i = 1; i <= m; ++i){
int j;
cin >> j;
dp[j] = 0;
}
for (int i = 1; i <= k; ++i){
int a, b, c;
cin >> a >> b >> c;
zajiao[c].push_back(make_pair(a, b));
}
f(t);
cout << dp[t] << endl;
return 0;
}