题目

思路

不想写了,直接使用

没错,关键就在求第 \(k\) 小的路径

上述提到堆的做法,我们可以用 \(STL\) 的优先队列来实现

只不过常数有点大~~~

\(Code\)

  1. #include<cstdio>
  2. #include<queue>
  3. #include<algorithm>
  4. using namespace std;
  5. typedef long long LL;
  6. const int N = 1e5 + 5;
  7. int n , k , h[N] , tot , cnt1 , cnt2;
  8. LL a[N] , b[N];
  9. struct edge{
  10. int to , nxt , w;
  11. }e[N << 1];
  12. struct node{
  13. int l , r;
  14. LL d;
  15. bool operator < (node c) const {return d > c.d;}
  16. };
  17. priority_queue<node> Q;
  18. inline void add(int x , int y , int z)
  19. {
  20. e[++tot].to = y;
  21. e[tot].w = z;
  22. e[tot].nxt = h[x];
  23. h[x] = tot;
  24. }
  25. inline void dfs(int x , int fa , int fl , LL D , int ad)
  26. {
  27. for(register int i = h[x]; i; i = e[i].nxt)
  28. {
  29. int v = e[i].to;
  30. if (v == fa) continue;
  31. D = D + 1LL * fl * e[i].w;
  32. if (ad) a[++cnt1] = D;
  33. else b[++cnt2] = -D;
  34. dfs(v , x , -fl , D , ad ^ 1);
  35. D = D - 1LL * fl * e[i].w;
  36. }
  37. }
  38. int main()
  39. {
  40. freopen("travel.in" , "r" , stdin);
  41. freopen("travel.out" , "w" , stdout);
  42. scanf("%d%d" , &n , &k);
  43. int u , v , w;
  44. for(register int i = 1; i < n; i++)
  45. {
  46. scanf("%d%d%d" , &u , &v , &w);
  47. add(u , v , w) , add(v , u , w);
  48. }
  49. b[++cnt2] = 0;
  50. dfs(1 , 0 , 1 , 0 , 1);
  51. sort(a + 1 , a + cnt1 + 1) , sort(b + 1 , b + cnt2 + 1);
  52. for(register int i = 1; i <= cnt1; i++) Q.push((node){i , 1 , a[i] + b[1]});
  53. node now;
  54. for(register int i = 1; i <= k; i++)
  55. {
  56. if (Q.size())
  57. {
  58. now = Q.top() , Q.pop();
  59. if (i == k)
  60. {
  61. printf("%lld" , now.d);
  62. return 0;
  63. }
  64. if (now.r + 1 <= cnt2) Q.push((node){now.l , now.r + 1 , a[now.l] + b[now.r + 1]});
  65. }
  66. else{
  67. printf("Stupid Mike");
  68. return 0;
  69. }
  70. }
  71. }

对于此类问题,我们还有一个很经典的做法

二分答案,然后判断路径组合中比这个答案小的能不能达到 \(k\)

后半句可以再套个二分实现

\(Code\)

  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. typedef long long LL;
  5. const int N = 1e5 + 5;
  6. int n , k , h[N] , tot , cnt1 , cnt2;
  7. LL a[N] , b[N];
  8. struct edge{
  9. int to , nxt , w;
  10. }e[N << 1];
  11. inline void add(int x , int y , int z)
  12. {
  13. e[++tot].to = y;
  14. e[tot].w = z;
  15. e[tot].nxt = h[x];
  16. h[x] = tot;
  17. }
  18. inline void dfs(int x , int fa , int fl , LL D , int ad)
  19. {
  20. for(register int i = h[x]; i; i = e[i].nxt)
  21. {
  22. int v = e[i].to;
  23. if (v == fa) continue;
  24. D = D + 1LL * fl * e[i].w;
  25. if (ad) a[++cnt1] = D;
  26. else b[++cnt2] = -D;
  27. dfs(v , x , -fl , D , ad ^ 1);
  28. D = D - 1LL * fl * e[i].w;
  29. }
  30. }
  31. inline int check(LL m)
  32. {
  33. int l , r , mid , res , sum = 0;
  34. for(register int i = 1; i <= cnt1; i++)
  35. {
  36. l = 1 , r = cnt2 , res = 0;
  37. while (l <= r)
  38. {
  39. mid = (l + r) >> 1;
  40. if (b[mid] + a[i] <= m) res = mid , l = mid + 1;
  41. else r = mid - 1;
  42. }
  43. sum += res;
  44. }
  45. return sum >= k;
  46. }
  47. int main()
  48. {
  49. freopen("travel.in" , "r" , stdin);
  50. freopen("travel.out" , "w" , stdout);
  51. scanf("%d%d" , &n , &k);
  52. int u , v , w;
  53. for(register int i = 1; i < n; i++)
  54. {
  55. scanf("%d%d%d" , &u , &v , &w);
  56. add(u , v , w) , add(v , u , w);
  57. }
  58. b[++cnt2] = 0;
  59. dfs(1 , 0 , 1 , 0 , 1);
  60. sort(a + 1 , a + cnt1 + 1) , sort(b + 1 , b + cnt2 + 1);
  61. if ((LL)cnt1 * cnt2 < k)
  62. {
  63. printf("Stupid Mike");
  64. return 0;
  65. }
  66. LL l = a[1] + b[1] , r = a[cnt1] + b[cnt2] , mid , res = l;
  67. while (l <= r)
  68. {
  69. mid = (l + r) >> 1;
  70. if (check(mid)) res = mid , r = mid - 1;
  71. else l = mid + 1;
  72. }
  73. printf("%lld" , res);
  74. }

实际上这两做法各有优劣

如果要求前 \(k\) 的话显然用堆,它的过程本质上就是取出了前 \(k\) 的数

JZOJ 4320. 【NOIP2015模拟11.5】旅行的更多相关文章

  1. [JZOJ 4307] [NOIP2015模拟11.3晚] 喝喝喝 解题报告

    题目链接: http://172.16.0.132/senior/#main/show/4307 题目: 解题报告: 题目询问我们没出现坏对的连续区间个数 我们考虑从左到有枚举右端点$r$,判断$a[ ...

  2. 【NOIP2015模拟11.5】JZOJ8月5日提高组T3 旅行

    [NOIP2015模拟11.5]JZOJ8月5日提高组T3 旅行 题目 若不存在第\(k\)短路径时,输出"Stupid Mike" 题解 题意 给出一个有\(n\)个点的树 问这 ...

  3. JZOJ 4298. 【NOIP2015模拟11.2晚】我的天

    4298. [NOIP2015模拟11.2晚]我的天 (File IO): input:ohmygod.in output:ohmygod.out Time Limits: 1000 ms Memor ...

  4. 【NOIP2015模拟11.5】JZOJ8月5日提高组T2 Lucas的数列

    [NOIP2015模拟11.5]JZOJ8月5日提高组T2 Lucas的数列 题目 PS:\(n*n*T*T<=10^{18}\)而不是\(10^1*8\) 题解 题意: 给出\(n\)个元素的 ...

  5. 【NOIP2015模拟11.5】JZOJ8月5日提高组T1 俄罗斯套娃

    [NOIP2015模拟11.5]JZOJ8月5日提高组T1 俄罗斯套娃 题目 题解 题意就是说 将1~\(n\)排列,问有多少种方案使得序列的逆序对个数小于\(k\) 很容易想到DP 设\(f[i][ ...

  6. 【NOIP2015模拟11.2晚】JZOJ8月4日提高组T2 我的天

    [NOIP2015模拟11.2晚]JZOJ8月4日提高组T2 我的天 题目 很久很以前,有一个古老的村庄--xiba村,村子里生活着n+1个村民,但由于历届村长恐怖而且黑暗的魔法统治下,村民们各自过着 ...

  7. 【NOIP2015模拟11.4】JZOJ2020年8月6日提高组T2 最优交换

    [NOIP2015模拟11.4]JZOJ2020年8月6日提高组T2 最优交换 题目 题解 题意 有一个长度为\(n\)的正整数 最多可以进行\(k\)次操作 每次操作交换相邻两个位置上的数 问可以得 ...

  8. 【NOIP2015模拟11.4】JZOJ8月6日提高组T1 刷题计划

    [NOIP2015模拟11.4]JZOJ8月6日提高组T1 刷题计划 题目 题解 题意 有\(n\)道题,编号为1~\(n\) 给出\(m\)次操作 每次操作有3种类型 1 \(x\) 表示交了\(A ...

  9. 【NOIP2015模拟11.3】备用钥匙

    题目 你知道Just Odd Inventions社吗?这个公司的业务是"只不过是奇妙的发明(Just Odd Inventions)".这里简称为JOI社. JOI社有N名员工, ...

  10. JZOJ4307. 【NOIP2015模拟11.3晚】喝喝喝

    Description

随机推荐

  1. 关于python实现与体重秤蓝牙ble通信研究(Linux)

    前言 前几天买一个带蓝牙的体重秤,功能就是可以通过手机app连接,然后每一次称重都会记录下来,然后进行一些计算(体脂等),但是我不想用手机来操作,我习惯用电脑,就想写一个软件来与体重秤通信,记录我的每 ...

  2. 关于 Windows6.1-KB2999226-x64.msu 此更新不适用你的计算机解决办法

    前言 今天被这个破问题坑了很长时间,网上一大堆扯跳过那个检查,通过提取 cab 文件然后直接用命令安装,我可以明确的告诉你不是那样的解决的,因为我实际用命令装过也装不上(这里我吐槽一下,我猜你最初的问 ...

  3. EndNote设置导出参考文献格式为中文国标GBT7714

    笔者使用的版本是最新的EndNote 20,其他版本大同小异. 依次打开:Tools -> Output Styles -> Open Style Manager.其他版本可能有差异,只要 ...

  4. C#代码扫描工具Sonarqube + Win10+SqlServer2017

    在之前的公司, 看到有用过代码扫描工具, 扫描C#代码, 最近公司也有考虑做这个,于是我便独自研究了一下,这里给大家做个分享 网上找了很多资料, 主要有以下问题: 1. Sonarqube用的是 旧版 ...

  5. CONDITION EVALUATION DELTA热部署启动失效

    1.问题描述 我在启动一个SpringBoot项目的时候,在启动中控制台不停的打印日志(如下图所示) 2.产生原因 当时我是看了这篇文章后CONDITION EVALUATION DELTA_苦逼码农 ...

  6. 启动springboot项目报错Unable to start embedded Tomcat

    1.问题描述 最近在学习springcloud的时候,在父工程下新建一个model后,引入dashboard相关依赖后启动报错 2.产生原因 产生原因有可能就是pom.xml中下载的jar包版本冲突 ...

  7. 第六节 FAF与GP不工作保护区的绘制

    飞行程序设计软件实践 前一篇文章中,通过风标设计2023插件,我们在CAD中绘制了FAP方式下的精密进近保护区. 接着这个话题我们继续来看一下FAF方式下的保护区应该怎样绘制,以及OAS参数的其它用法 ...

  8. BBS项目(二): 登录功能 首页导航条搭建 首页主体部分 个人站点页面搭建 文章分类与标签 日期归档

    目录 登录功能 pillow模块生成验证码 前端发送ajax请求 后端auth模块校验 sweetalert弹窗提示登录失败 首页导航条搭建 修改密码 退出登录 首页主体部分 首页前端框架搭建 adm ...

  9. python之路51 聚合查询 分组查询

    图书管理系统 1.表设计 先考虑普通字段再考虑外键字段 数据库迁移.测试数据录入 2.首页展示 3.书籍展示 4.书籍添加 5.书籍编辑 后端如何获取用户想要编辑的数据.前端如何展示出待编辑的数据 6 ...

  10. [LeetCode]819. 最常见的单词

    题目 给定一个段落 (paragraph) 和一个禁用单词列表 (banned).返回出现次数最多,同时不在禁用列表中的单词.题目保证至少有一个词不在禁用列表中,而且答案唯一. 禁用列表中的单词用小写 ...