AcWing 3305. 作物杂交
创始人
2024-05-30 19:22:11
0

 

先看看题目,总结下来就是根据已有的种子进行杂交,以最快的速度得到目标种子。

这个题是蓝桥杯的原题,在蓝桥杯练习系统提交的时候,用dfs是可以过的,但是在acwing上是过不了的,好像是因为会出现环。

所以在这里把两种思路都记下来。

1.dfs

dfs的思路比较简单,查找可以杂交得到目标种子的植物a和b,如果a和b没有现成的种子,那么接着查找a和b通过杂交得到的最短时间。

这个思路很简单的,所以也没啥可说的。然后一个需要注意的点是dfs返回的是得到该种子的时间,所以杂交的时候得等到这个种子长成植物之后才可以。

那么我们在计算通过种子a和b得到c的时间就是seed[a] = max(seed[b],seed[c])+max(t[a],t[b]).先同时得到a和b的种子,然后同时种下去。

代码如下:

int T[N];
int K[N];
int flag[N];  //是否得到了这个种子 
int seed[N];  //得到每个种子的最小时间 
vectormp[N];
int dfs(int x){for(int i = 0; i < mp[x].size(); i += 2){int a = mp[x][i];int b = mp[x][i + 1];if(!flag[a]) seed[a] = dfs(a);if(!flag[b]) seed[b] = dfs(b);seed[x] = min(seed[x], max(seed[a], seed[b]) + max(T[a], T[b]));flag[x] = 1;} return seed[x];
} 
int main(){int n, m, k, t;cin>>n>>m>>k>>t;memset(seed, 0x3f, sizeof(seed));for(int i = 1; i <= n; i++){cin>>T[i];} for(int i = 0; i < m; i++){cin>>K[i];flag[K[i]] = 1;seed[K[i]] = 0; }for(int i = 0; i < k; i++){int a, b, c;cin>>a>>b>>c;mp[c].push_back(a);mp[c].push_back(b);}cout<

2.spfa

说实话,如果这道题的算法标签不打上spfa的话,我是肯定想不到的。但是即使打上了,我也还是没明白怎么建图。

下面记录一下我的草率理解。

图中有n个顶点,有m条边,我们在使用邻接表建图的时候,这条边上不但可以存储边权,也可以存储其他的信息,例如这条边相关的两个节点可以生成的新种子。那么我们在建边的时候不但要记录这条边的两个顶点还要记录这两个种子杂交生成的新种子。

然后这个题我是这么理解的,因为我们想要得到生成目标种子的最短时间,相当于走了很多条边然后得到一条到目标种子t的最短路。

但是这个spfa是计算的单源路径的,这个源在哪呢?于是我们想到了前几天做的那道题,我们也虚拟一个超级源点,然后对于每个已有的种子,和这个超级源点0之间的距离就是0。然后我们对现有的边开始枚举,不断更新每个顶点到源点的距离,直到我们得到目标种子的最短时间,也就是和源点之间的最短路径。

然后代码如下:

#include
#include
#include
#include
#include
#include
#define ll long long
using namespace std;
const int N = 2010;
const int M = 200005;
int h[N], e[M], ne[M], target[M], idx, w[N];
int dis[N]; 
bool st[N];
int n, m, k, t; 
queueq;
void add(int a, int b, int c){e[idx] = b;target[idx] = c;  //可以杂交生成的种子ne[idx] = h[a];h[a] = idx++;
} 
void spfa(){while(q.size()){int x = q.front();q.pop();st[x] = false;  //出队就标记for(int i = h[x]; i != -1; i = ne[i]){int y = e[i];int z = target[i];if(dis[z] > max(dis[x], dis[y]) + max(w[x], w[y])){  //用这两个顶点来更新边上的顶点zdis[z] = max(dis[x], dis[y]) + max(w[x], w[y]);if(!st[z]){q.push(z);st[z] = 1;  //入队}}} }
}
int main(){scanf("%d%d%d%d", &n, &m, &k, &t);memset(dis, 0x3f, sizeof(dis));memset(h, -1, sizeof(h));for(int i = 1; i <= n; i++) scanf("%d", &w[i]);for(int i = 1; i <= m; i++){int x;scanf("%d", &x);dis[x] = 0;  //现有的种子,最短路径为0q.push(x);st[x] = true;   //如入队了}for(int i = 1; i <= k; i++){int a, b, c;scanf("%d%d%d", &a, &b, &c);add(a, b, c);add(b, a, c);} spfa();printf("%d\n", dis[t]);return 0;
} 

我是真的不懂spfa是什么。先写到这,我饿了。

最近睡得不好,心脏都不好。我明天开始就好好养生,好好学习!!!

相关内容

热门资讯

欧洲多国领导人抵达乌克兰基辅进... 当地时间5月10日,德国总理默茨、法国总统马克龙以及英国首相斯塔默抵达乌克兰基辅进行访问。访问期间,...
“不能容忍”间谍活动 丹麦召见... 据新华社奥斯陆5月8日电 丹麦外交大臣拉斯穆森8日召见美国驻丹麦使馆临时代办詹妮弗·霍尔·戈弗雷,...
政策注资破局 金融权重擎旗 4月沪深股市小幅下跌后,5月A股迎来开门红。本周在一系列利好影响下,沪深股市普遍收阳,上证指数已经补...
致敬隐蔽战线上的无名英雄   由刘江执导,张鲁一、高圆圆主演的当代国安反间谍剧《绝密较量》正在央视一套和爱奇艺播出。该剧是北京...
朝阳区安贞街道五彩油菜花开了,... 新京报讯(记者吴婷婷)近日,北京朝阳区安贞街道的五彩油菜花花海盛放。记者了解到,随着安贞拾光主题广场...
秦安县公安局北关派出所扎实推进...   为进一步加强辖区社会治安管理,夯实基层基础治理根基。近日,秦安县公安局北关派出所组织民辅警深入辖...
“工地妈妈”的母亲节 转自:中工网原标题:“工地妈妈”的母亲节工人日报-中工网记者 刘兵 通讯员 李诗琴 郭昌鑫在钢筋水泥...
模拟演练+实操提升避险能力 5月12日是第17个全国防灾减灾日。昨天下午,市防灾减灾救灾委员会办公室、市应急管理局、闵行区人民政...
快来报名!“鹭引五洲 才聚八闽... 来源:环球网 “鹭引五洲 才聚八闽”2025全球创新创业大赛今天开始报名!一等奖15万元二等奖10万...
巴基斯坦今晨对印度展开军事行动 据新华社伊斯兰堡5月10日电 巴基斯坦军方官员10日表示,巴军方已开始对印度采取军事行动,以回应印...
布袋上的猫 朱蕊 夏目漱石写道:“我是只猫儿……在那儿第一次看见了人这种怪物……当时我想:‘人真是个奇妙之...
低迷中反弹 他只用了一场比赛 孙铭徽(右)在比赛中拼抢 图 新华社 103比96,昨晚的CBA总决赛...
卢正任上海市司法局副局长 上海市司法局官方网站“领导信息”页面显示,卢正现任上海市司法局党委委员、副局长。卢正,1977年1月...
以绿色动能重塑行业标杆:ESG... 在高质量发展的战略引领和“双碳”目标的持续推动下,ESG与中国经济社会发展正在加速融合。作为一种基本...
方媛媛,谢谢你! 4月30日在飞驰的G7645次列车上一场突如其来的急救考验让一位“00后”用实际行动诠释了“白衣天使...
鲁比奥就印巴局势升级表态 “首次”,美媒:鲁比奥与巴基斯坦陆军参谋长通话,称美国愿协助调解巴印冲突据路透社等媒体10日最新消息...
传化集团与浙江人形机器人创新中... 人民财讯5月10日电,5月8日,传化集团与浙江人形机器人创新中心战略合作签约仪式举行。双方将共建机器...
南方航空相关公司新增一项950... (转自:快查一企业中标了)快查APP显示,南方航空相关公司厦门航空有限公司于2025年5月9日发布一...
在县城荡马路 叶辛 只因布依族聚居的涟江边有一个好花红书院,我时常到黔南的惠水县去。每次去都忙于到好花红镇的...
东城文保全息展柜让文物活起来   本报讯(记者李瑶)在北京科博会上,东城展区以“高品质打造东城科创金三角”为主线,共邀请了35家企...