【XR-3】核心城市

这题真的难啊.........

k个核心城市太麻烦,我们假设先找一个核心城市,应该放在哪里?

\(任意取一个点,它的最远端是直径的端点。\)

\(所以当这个点是直径的中点时,可以达到题目的要求(最大距离最小)\)

\(想求中点,我们就保存直径的路径,中间的点就是中点了。\)

\(然后该怎么办?其余的k-1个点怎么选?\)

\(发现7、8号节点距离可核心城市最远,目前影响答案的是他们,所以我们下一步应该把2和3号节点变成核心城市\)

\(至此,贪心策略已经出来了\)

\(在以直径中点为根的树中,我们总是选取那些maxdeep-mydeep最大的节点\)

\(其中maxdeep是当前节点能到的最大深度,也就是这个分支离核心城市最远的节点\)

\(deep是自己的深度\)

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn=200009;
  4. struct p{
  5. int to,nxt;
  6. }d[maxn];int n,k,cnt=1;
  7. int head[maxn],dis[maxn],deep[maxn],maxdeep[maxn],f[maxn];
  8. void add(int u,int v){
  9. d[cnt].nxt=head[u],d[cnt].to=v,head[u]=cnt++;
  10. }
  11. int num,juli=0;
  12. void dfs1(int now,int ju,int fa)
  13. {
  14. if(ju>juli)
  15. {
  16. juli=ju;
  17. num=now;
  18. }
  19. for(int i=head[now];i;i=d[i].nxt)
  20. {
  21. int v=d[i].to;
  22. if(v==fa) continue;
  23. dfs1(v,ju+1,now);
  24. }
  25. }
  26. void dfs2(int now,int ju,int fa)
  27. {
  28. if(ju>juli)
  29. {
  30. juli=ju;
  31. num=now;
  32. }
  33. for(int i=head[now];i;i=d[i].nxt)
  34. {
  35. int v=d[i].to;
  36. if(v==fa) continue;
  37. f[v]=now;
  38. dfs2(v,ju+1,now);
  39. }
  40. }
  41. void dfsz(int now,int fa)
  42. {
  43. maxdeep[now]=deep[now];
  44. for(int i=head[now];i;i=d[i].nxt)
  45. {
  46. int v=d[i].to;
  47. if(v==fa) continue;
  48. deep[v]=deep[now]+1;
  49. dfsz(v,now);
  50. maxdeep[now]=max(maxdeep[now],maxdeep[v]);
  51. }
  52. }
  53. bool com(int a,int b){
  54. return a>b;
  55. }
  56. int main()
  57. {
  58. cin>>n>>k;
  59. for(int i=1;i<n;i++)
  60. {
  61. int l,r;
  62. cin>>l>>r;
  63. add(l,r);add(r,l);
  64. }
  65. dfs1(1,0,0);//找出直径的端点
  66. juli=0;
  67. dfs2(num,0,0);//找出直径的路径
  68. int mid=num;//直径的端点
  69. for(int i=1;i<=(1+juli)/2;i++)//一共经过了juli个点
  70. mid=f[mid];
  71. dfsz(mid,0);
  72. for(int i=1;i<=n;i++) deep[i]=maxdeep[i]-deep[i];
  73. sort(deep+1,deep+1+n,com);
  74. int ans=0;
  75. for(int i=k+1;i<=n;i++) ans=max(ans,deep[i]+1);
  76. cout<<ans;
  77. }

【XR-3】核心城市(树直径)的更多相关文章

  1. LG5536 「XR-3」核心城市 树的直径

    问题描述 LG5536 题解 两次 \(\mathrm{dfs}\) 求树的直径. 然后找到树的直径的中点. 然后按照 子树中最深的点深度-自己深度 排序,贪心选取前 \(k\) 个. \(\math ...

  2. Comet OJ - Contest #9 & X Round 3 【XR-3】核心城市 【树的理解】

    一.题目 [XR-3]核心城市 二.分析 题意就是在树中确定$K$个点,满足剩下的$N-K$个点中到这$K$个点的最大距离尽可能小. 理解上肯定是确定一个根,这个根是这个图的中心. 可以通过根据结点的 ...

  3. [TJOI2017] 城市 (树的直径,贪心)

    题目链接 Solution 这道题,调了我一晚上... 一直80分 >_<|| ... 考虑到几点: 分开任意一条边 \(u\) ,那么其肯定会断成两棵树. 肯定是分开直径上的边最优,否则 ...

  4. 解题报告:luogu P5536 【XR-3】核心城市

    题目链接:P5536 [XR-3]核心城市 这题是某次月赛题. 这题我完全是看标签猜的. 优先选择直径中点即可,这里重要的是互通,很容易想到用堆维护可选的,预处理直径和距叶节点距离即可(最近),实质上 ...

  5. HDU 4607 Park Visit 两次DFS求树直径

    两次DFS求树直径方法见 这里. 这里的直径是指最长链包含的节点个数,而上一题是指最长链的路径权值之和,注意区分. K <= R: ans = K − 1; K > R:   ans = ...

  6. [HDOJ2196]Computer (树直径, 树DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2196 给一棵树,求树上各点到某点的距离中最长的距离.注意每个点都要求. 和普通求树的直径不一样,要求每 ...

  7. [HDOJ4612]Warm up(双连通分量,缩点,树直径)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4612 所有图论题都要往树上考虑 题意:给一张图,仅允许添加一条边,问能干掉的最多条桥有多少. 必须解决 ...

  8. CodeForces 455C Civilization(并查集+树直径)

    好久没有写过图论的东西了,居然双向边要开两倍空间都忘了,不过数组越界cf居然给我报MLE??这个题题意特别纠结,一开始一直不懂添加的边长是多长... 题意:给你一些点,然后给一些边,注意没有重边 环, ...

  9. luogu 4381 [IOI2008]Island 单调队列 + 基环树直径 + tarjan

    Description 你将要游览一个有N个岛屿的公园.从每一个岛i出发,只建造一座桥.桥的长度以Li表示.公园内总共有N座桥.尽管每座桥由一个岛连到另一个岛,但每座桥均可以双向行走.同时,每一对这样 ...

随机推荐

  1. C#多线程(4):进程同步Mutex类

    Mutex 类 构造函数和方法 系统只能运行一个程序的实例 解释一下上面的示例 接替运行 进程同步示例 另外 Mutex 类 Mutex 中文为互斥,Mutex 类叫做互斥锁.它还可用于进程间同步的同 ...

  2. C#多线程(6):线程通知

    目录 AutoRestEvent 类 常用方法 一个简单的示例 解释一下 复杂一点的示例 解释 回顾一下,前面 lock.Monitor 部分我们学习了线程锁,Mutex 部分学习了进程同步,Sema ...

  3. Pormetheus(一)

    (1)Prometheus由来普罗米修斯的灵感来自于谷歌的Borgmon.它最初是由马特·t·普劳德(Matt T. Proud)作为一个研究项目开发的,普劳德曾是谷歌(google)的一名雇员.在普 ...

  4. HTTPS工作流程

    HTTPS工作流程 RSA算法 RSA的密钥分成两个部分: PublicKey 加密数据 验证签名 不能解密 任何人都可以获得 Private Key 数据签名(摘要算法) 解密 加密(不用此功能) ...

  5. Golang Web入门(2):如何实现一个高性能的路由

    摘要 在上一篇文章中,我们聊了聊在Golang中怎么实现一个Http服务器.但是在最后我们可以发现,固然DefaultServeMux可以做路由分发的功能,但是他的功能同样是不完善的. 由Defaul ...

  6. three.js obj转js的详细步骤 convert_obj_three.py的用法

    three.js是最近非常流行的一个前端webgl库. js格式的模型文件是three.js中可以直接加载的文件.使用THREE.JSONLoader()直接加载,而不需要引用其它的loader插件. ...

  7. 提高万恶的KPI,切忌要避开这六个低效的编程习惯

    作者:程序员小跃 Slogan:当你的才华还无法撑起你的野心时,那应该静下心来好好学习 上次的翻译,引起了很大的反响,大家都想知道自己和高级工程师的差距,看了我的文章,是不是都在默默地做着比较呢?如果 ...

  8. 本地同时使用多个git账号

    config文件说明 Git Document指示在首次安装git的时候需要配置Config的相关内容信息,有三个地方存储了config文件,决定了读取的场景不同. 1 /etc/gitconfig: ...

  9. java实现自定义哈希表

    哈希表实现原理 哈希表底层是使用数组实现的,因为数组使用下标查找元素很快.所以实现哈希表的关键就是把某种数据类型通过计算变成数组的下标(这个计算就是hashCode()函数 比如,你怎么把一个字符串转 ...

  10. pytorch seq2seq闲聊机器人加入attention机制

    attention.py """ 实现attention """ import torch import torch.nn as nn im ...