参考代码:
#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;
}