参考代码:
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
int cost[2005]; //记录每个作物杂交所需要的时间
int dis[2005]; //记录每个作物到t点的最短时间
struct node{ //结构体存储每种杂交方案
int a, b, time;
};
vector<node> solution[2005]; //记录每个种子可以由哪些作物杂交而来
int dfs(int v) //dfs深搜
{
if(dis[v] != INF) //边界条件:当前种子存在时直接返回所需时间,此时若不是INF,那么一定已经是最小时间
return dis[v];
node w;
for(int i = 0; i < solution[v].size(); i++) //遍历杂交方案
{
w = solution[v][i];
dis[v] = min(dis[v], max(dfs(w.a), dfs(w.b))+w.time);
}
return dis[v];
}
int main()
{
ios::sync_with_stdio(false);
int n, m, k, t;
cin >> n >> m >> k >> t;
for(int i = 1; i <= n; i++)
{
cin >> cost[i];
}
fill(dis, dis+2005, INF);
int t_seed;
for(int i = 1; i <= m; i++)
{
cin >> t_seed;
dis[t_seed] = 0; //等于0表示当前时间为0,即初始拥有的种子
}
int ta, tb, tt;
for(int i = 1; i <= k; i++)
{
cin >> ta >> tb >> tt;
node temp;
temp.a = ta;
temp.b = tb;
temp.time = max(cost[ta], cost[tb]); //作物杂交的时间
solution[tt].push_back(temp); //将当前方案放入生成的种子的vector里
}
dfs(t);
cout << dis[t]; //输入终点t的最短时间
return 0;
}