蓝桥杯 作物杂交 DFS搜索

参考代码:

#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; 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值