题目链接:https://www.lanqiao.cn/problems/506/learning/
一道dfs+贪心算法的题
这道题有一点题目上没说,就是一个作物一定只有一种方案可以杂交出来
明白这里点,我们就可以去从后往前倒着推导
要注意到 获取 a和获取b可以同时进行
贪心公式 fc = max(a,b) + max(fa获取a的时常,fb获取b的时常)
#include<bits/stdc++.h> using namespace std; const int N = 2010; typedef pair<int, int> PII; int w[N], f[N]; bool have[N]; vector<PII> fa[N]; int dfs(int t) { for(int i = 0; i < fa[t].size(); i++) { int a = fa[t][i].first, b = fa[t][i].second; if(!have[a]) dfs(a); if(!have[b]) dfs(b); if(have[a] && have[b]) { have[t] = true; f[t] = min(f[t], max(w[a], w[b]) + max(f[a], f[b]));//贪心本质 //种子c = max a b + max 获取a的时常和获取b的时常 //需要明白获取a 和 获取 b 也是可以同时进行的 } } return f[t]; } int main() { int n, m, k, t; cin >> n >> m >> k >> t; memset(f, 0x3f3f, sizeof f); for(int i = 1; i <= n; i++) cin >> w[i];//输入种子成熟的时间 for(int i = 1; i <= m; i++)//输入已经拥有了哪些种子 { int temp; cin >> temp; have[temp] = true; f[temp] = 0; } for(int i = 1; i <= k; i++) { int a, b, c; cin >> a >> b >> c; fa[c].push_back({a, b}); //这里是用数组下标代表c 然后 纳入两个a b杂交参数 } cout << dfs(t); return 0; }