4.1.6 L2-043龙龙送外卖

  • 题目地址:https://pintia.cn/problem-sets/994805046380707840/exam/problems/1518582482059845632

  • 题目概述:

    这是一道关于求树中各个结点深度的题,两种方法:用DFS(将输入转为孩子表示法);用回溯法(从结点往上找双亲结点统计出结点的距离)。题目每新增一个外卖点,就是将之前的点一起结合起来探寻最短路径。

    首先这是一棵树,单看每个结点它自己的最短路径就是自身的深度-1(根结点深度为1),所以主要问题就是怎么合理安排这些外卖点的访问顺序让总体送外卖的距离最短。

    因为可能有些点不在同一个分支上,就会造成访问完然后再返回到分支处访问另一个结点。可以确定的是每个结点到外卖点的距离是唯一的,所以我们要做的就是让外卖员返回的路程尽量的少,因为最后不需要返回到外卖点,所以我们可以将深度最深的点留到最后去找,这样就不需要再返回一次增加额外更多的距离了。

  • 主要操作:

    采用的是回溯法求结点,不过会将回溯过程中经过的结点顺便求出它的深度。需要一个max值存储前一次的最大深度,这决定了哪条分支会最后被访问。

    1. 要是本身这个点前面就求出了深度了,说明这个点送外卖时肯定访问过,而题目又说送的顺序任意,所以直接就先送这个,那么距离就不会增加(与该点之前求得的距离相同)。
    2. 要是整条路都没遇到已经求过的点,说明这条分支从未被访问过。如果此点的距离>max,,那就需要从max点返回再走向当前点。如果此点的距离<=max,说明该点先需要被访问,回去再回到外卖点,两倍的该点的距离(深度-1)
    3. 要是遇到一个点回溯过程中遇到已知深度的点,就可以结束回溯,直接将已知深度 与 目前回溯的步数相加即可得到所求点的深度。此时会出现出现2种情况。
      1. max<当前点距离,说明此时当前点应该最后被访问,max点必须再走一遍max距离回到外卖点再到当前点。而上一次的情况,当前点这个分支(碰到已知深度的点作为分叉点)到外卖点肯定多走了一次,需要减去一次,然后再加上分叉点到当前的距离即可。
      2. max>=当前点距离,说明这个点需要来回两次(不是最后被访问),所以直接上一次情况+2倍的分叉点到当前的距离。
  • 代码:

    #include <iostream>
    using namespace std;
    /*以后不管怎么样,尽量把数组开大点。
    */
    int N, M;
    int node[100010];
    // int inRoad[100010];
    int level[100010];
    int temp[100010];
    int main()
    {cin >> N >> M;for (int i = 1; i <= N; i++){cin >> node[i];}int max = 0;int sumOfRoadDis = 0;int count2Root = 0, count2Same = 0;int point = M;int x;while (point--){count2Root = 0;count2Same = 0;cin >> x;int parent = x;// 说明访问过,直接输出先前的距离if (level[x] != 0){cout << sumOfRoadDis << endl;continue;}// 从这个点的父亲开始访问循环// 这个是最花时间的while (parent != -1){if (level[parent] == 0){temp[count2Same] = parent;// inRoad[parent] = 1;count2Same++;}else{break;}count2Root++;parent = node[parent];}// 得到了从外卖点到x的路径长度,也确定了途中经过的点。// 此时parent的值要么为-1,要么这个parent是被访问过的,并且它的距离也知道。if (parent == -1){int length = count2Same - 1;for (int i = 0; i < count2Same - 1; i++){level[temp[i]] = length;length--;}}else{int length = count2Same;for (int i = 0; i < count2Same; i++){level[temp[i]] = level[parent] + length;length--;}}count2Root = level[x] + 1;// 说明途中压根就没遇到经过点if (count2Root == count2Same){count2Root--;if (count2Root > max){sumOfRoadDis = sumOfRoadDis + max + count2Root;}else{sumOfRoadDis = sumOfRoadDis + 2 * count2Root;}}// 说明经过了点。else{count2Root--;if (count2Root <= max){sumOfRoadDis += count2Same * 2;}else{sumOfRoadDis += max - count2Root + count2Same * 2;}}cout << sumOfRoadDis << endl;if (count2Root > max){max = count2Root;}}return 0;
    }
    

PTA L2-043龙龙送外卖相关推荐

  1. PTA L2-043 龙龙送外卖

    龙龙送外卖 龙龙是"饱了呀"外卖软件的注册骑手,负责送帕特小区的外卖.帕特小区的构造非常特别,都是双向道路且没有构成环 -- 你可以简单地认为小区的路构成了一棵树,根结点是外卖站, ...

  2. 浙大读博八年现靠送外卖赚钱,本人:进组以来博士无一人按时毕业

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 杨净 发自 凹非寺 量子位 | 公众号 QbitAI 浙大在读博士, ...

  3. 95后程序员月薪2万背着电脑送外卖,送单途中改Bug

    公众号关注 "视学算法" 设为 "星标",消息即可送达! 来源:云技术(ID:aiyunjishu) [#95后程序员背着电脑送外卖# 随时应对甲方临时需求] ...

  4. 送外卖最强的男人!!

    前几天朋友圈看见一张截图,截图是一个外卖小哥的求职简历,简历的工作描述十分引人注目. 很多人在朋友圈评论很好笑,而我却陷入了沉思. 在我心中,最强的男人要不是这样的 要不是这样的 而萌萌的外卖小哥怎么 ...

  5. 阿里程序员回老家被哥们问工作,回答在阿里,哥们却吐槽:破IT就破IT,还阿里巴巴!网友:京东就是送快递的,美团就是送外卖的!...

    请点击上面 一键关注! 大学生回老家最怕被问专业,如果你说学计算机,亲戚就会让你修电脑:如果你说学酒店管理,亲戚会以为你是服务员:如果你说学建筑,亲戚会说原来你是工地搬砖的-- 大学毕业参加工作后再回 ...

  6. 无人机送外卖已落地深圳,这体验有多爽?你根本想不到!

    杨净 发自 凹非寺 量子位 报道 | 公众号 QbitAI 「天上掉馅饼」时代,已经来临! 作为领域里最饱受期待的场景之一 -- 无人机送外卖,已经率先在深圳启动. 美团,首次官宣即落地.截止6月,面 ...

  7. 美团北京,今日起无人驾驶送外卖

    杨净 发自 凹非寺 量子位 报道 | 公众号 QbitAI 自动驾驶落地,载物快于载人已是共识. 在这个领域,最具场景优势和最不容忽视的玩家--美团,最近就有一系列动向. 比如,刚融资100亿美元,用 ...

  8. 三个斯坦福华裔学生,送外卖成亿万富翁

    DoorDash创始人们 没想到,三位于"硅谷创业摇篮"--斯坦福大学毕业的华人学生,撑起了美国外卖半壁江山. 三人一夜之间也成为了亿万富翁,平均年龄竟还不到30岁. 01 美版美 ...

  9. Web前端工程师求职的失败——评《非你莫属》20120909期宋龙龙片段

    偶然看了<非你莫属>20120909期宋龙龙求职的视频片段(地址:http://v.youku.com/v_show/id_XNDQ4NTk5OTQw.html ).这位曾经为了考上清华大 ...

最新文章

  1. 网易2017春招笔试真题编程题集合(2)——赶去公司
  2. 遇到问题描述:Android Please ensure that adb is correctly located at问题解决
  3. 初学__Python——用包来管理多个模块
  4. 苹果新隐私政策在iOS14.4测试版上线:能允许或拒绝“跟踪”
  5. AE域名,沙漠之花阿联酋的专属域名-域名百科
  6. POJ1209 UVA158 Calendar题解
  7. Nordic-nRF52840环境搭建及学习
  8. iphone查看python文件_通过python获取苹果手机备份文件中的照片,视频等信息采集...
  9. 码斗士的修炼之路 -- 如何保持并提升战斗力
  10. 计算机按键变成音符怎么弄,电脑键盘的数字都变成了符号、怎么弄才能变成数字阿?...
  11. solr7.4-DIH
  12. 郭台铭为什么如此有魄力?
  13. 小心看上去平平无奇的陷阱:如何防范高级渣?
  14. textarea自适应笔记(vue)
  15. 在国内的现货白银生存要具备的心态
  16. 解决 ERROR: cannot launch node of type [xxx]: can‘t locate node [xxx] in package [xxx]
  17. 搜狗2012 9 23校园招聘会笔试题
  18. 机械工程材料课程考试复习题及参考答案
  19. iOS开发-简单制作九宫格拼图
  20. Saliency as Evidence: Event Detection with Trigger Saliency Attribution(ACL2022)

热门文章

  1. python语言表白语句简单_简短的表白语句280句
  2. Arduino (一)——面包板与固定导线长度
  3. 一觉醒来,欠费120万,移动程序员要被祭天了!
  4. 我的2013拾遗总结~ 多么痛的领悟!
  5. 雷诺手表如何查真假?如何判断雷诺手表是否为真品?
  6. CHROME扩展笔记之设置代理(项目完成再上完整案例)
  7. 港科夜闻|香港科大陈启峰教授:人工智能与深度学习交织-从竞赛开始,到无尽钻研...
  8. 电脑运行应用程序出现0xc000007b的解决方法
  9. 关于oxc000007b错误的解决办法
  10. 谈谈privoxy:关于广告过滤和自动代理切换