作物杂交
问题描述
输入格式
输出格式
输出一个整数,表示得到目标种子的最短杂交时间。
样例输入
6 2 4 6
5 3 4 6 4 9
1 2
1 2 3
1 3 4
2 3 5
4 5 6
样例输出
16
样例说明
数据规模和约定
解析:本题用深度优先搜索,找出作物所需的最短杂交时间。
需用用到Vector 容器存储杂交方案,因为一种植物可能有多种杂交方法,需要找到最短的杂交时间。
Vector[i][j] 里面存储的是植物 i 在它的杂交方案的第j种的父母的 编号 x y
植物最短杂交时间求法(生成植物的最短时间)
- 植物已经有了,最短杂交时间为
0
- 植物 i 没有,需要杂交生成 最短杂交时间为 生成父母的时间 + 父母杂交生成植物 i 的时间
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
#include <cstdio>
using namespace std;
int n, m, k, t;
//N作物种类总数 M初始拥有数量,K杂交的方案数,T目标种子
const int N = 2005;
struct parent{
int x;
int y;
};
vector< vector<parent> > hybrid(N); //存储所有的杂交方案
int ti[N]; //存储种植时间
int minT[N]; //存储作物的最短杂交时间 因为一种作物 可能有几种合成方法
bool have[N]; //表示作物是否拥有 或者 是否得知作物的最短杂交时间
int f(int t)
{
if (have[t]) //若是已有杂交出该种作物的最短时间
return minT[t];//直接返回即可
for(int i = 0; i < hybrid[t].size(); i ++)
{
parent tp = hybrid[t][i]; //能够杂交出当前作物的第i种方案
//而每种方案的最短时间是
int hyparent = max(ti[tp.x], ti[tp.y]); //父母作物杂交所需时间
int plparent = max(f(tp.x), f(tp.y)); //种植父母所需时间
int sum = hyparent + plparent; //种植其‘父母’作物 time + 其父母作物杂交 Time
minT[t] = min(minT[t], sum); //取最小值
}
have[t] = 1; //表示该作物的最短杂交时间已经找到
return minT[t];
}
int main()
{
// 请在此输入您的代码
memset(minT, 0x3f, sizeof minT);
//freopen("C:\\Users\\HK\\Desktop\\temp.txt","r",stdin); //快速输入
cin >> n >> m >> k >> t;
for(int i = 1; i <= n; i ++) cin >> ti[i];
for(int i = 1; i <= m; i ++)
{
int x; cin >> x; have[x] = 1; minT[x] = 0;//最短杂交时间 = 0,因为不需要杂交
}
for(int i = 1; i <= k; i ++)
{
parent tp; int v;
cin >> tp.x >> tp.y >> v;
hybrid[v].push_back(tp); //存储杂交方案
}
cout << f(t); //递归求解
return 0;
}