题目链接

Solution

1.先找出树的直径.
2.遍历直径沿途的每一个节点以及它的子树.
3.然后对于每个非直径节点直接统计答案,令直径的两个端点为 \(x_1,x_2\) .
\[Ans=\sum{Max(dis(i,x1),dis(i,x2))}\]
最后再单独把直径拎出来,单独统计一次就好了.
正确性证明:
redbag 一句话解决:

如果说这其中的某个答案不是最优,那么找的直径不就是错的么。

"跑的飞快。"

Code

#include<bits/stdc++.h>
using namespace std;
const int maxn=200008;
struct sj{int to,next;
}a[maxn*2];
int head[maxn],size,x,y,road[maxn];
int root,flag,n,cnt,far[5],kk,vis[maxn];
int dis[maxn][3],v[maxn],num;
long long ans;
int ans1[maxn],ans2[maxn],siz;
void add(int x,int y)
{a[++size].to=y;a[size].next=head[x];head[x]=size;
}void dfs(int x)
{v[x]=1; if(cnt>kk)far[root==1?1:2]=x,kk=cnt;      for(int i=head[x];i;i=a[i].next){int tt=a[i].to;if(!v[tt])cnt++,dfs(tt);}   v[x]=0; cnt--;
}void fuck(int x)
{v[x]=1;if(x==far[2]){flag=1;}for(int i=head[x];i;i=a[i].next){int tt=a[i].to;if(!v[tt])fuck(tt);if(flag){road[++num]=x;vis[x]=1;break;}}v[x]=0;
}void getans(int x)
{v[x]=1;for(int i=head[x];i;i=a[i].next){int tt=a[i].to;if(!v[tt]&&!vis[tt])getans(tt),ans+=max(dis[tt][1],dis[tt][2]);}if(dis[x][1]>dis[x][2])ans1[++siz]=far[1];else ans1[++siz]=far[2];ans2[siz]=x;v[x]=0;
}void getdis(int x,int to)
{v[x]=1;for(int i=head[x];i;i=a[i].next){int tt=a[i].to;if(!v[tt]){dis[tt][to]=dis[x][to]+1; getdis(tt,to);}}v[x]=0;
}int main()
{cin>>n;for(int i=1;i<n;i++){scanf("%d%d",&x,&y),add(x,y), add(y,x);}root=1; dfs(root); root=far[1]; kk=0; cnt=0;  dfs(root); fuck(root);getdis(far[1],1); getdis(far[2],2);for(int i=2;i<num;i++)getans(road[i]),siz--;for(int i=1;i<=kk;i++)ans+=i;cout<<ans<<endl;for(int i=1;i<=siz;i++)cout<<ans1[i]<<' '<<ans2[i]<<' '<<ans2[i]<<endl;for(int i=1;i<num;i++)cout<<far[1]<<' '<<road[i]<<' '<<road[i]<<endl;
}

转载于:https://www.cnblogs.com/Kv-Stalin/p/9371937.html

CF911F Tree Destruction (树的直径,贪心)相关推荐

  1. [SDOI2013]直径 (树的直径,贪心)

    题目链接 Solution 我们直接找到一条直径 \(s\),起点为 \(begin\),终点为 \(end\). 从前往后遍历点 \(u\) ,若子树中最大的距离与 \(dis(u,begin)\) ...

  2. Codeforces 911F Tree Destruction

    Tree Destruction 先把直径扣出来, 然后每个点都和直径的其中一端组合, 这样可以保证是最优的. #include<bits/stdc++.h> #define LL lon ...

  3. CodeForces-734E Anton and Tree 树的直径

    题目大意: 给定一棵有n个节点的树,有黑点白点两种节点. 每一次操作可以选择一个同种颜色的联通块将其染成同一种颜色 现在给定一个初始局面问最少多少步可以让树变为纯色. 题解: 首先我们拿到这棵树时先将 ...

  4. luogu P4408 [NOI2003]逃学的小孩(树的直径)

    整理的算法模板合集: ACM模板 看了半天的题原来没有告诉你三个点的坐标,不然直接跑最短路即可.要求最长的时间,所以我们要自己找到三个点,而在树中最长的路径也就是树的直径.那么本题就可以简化为:在一棵 ...

  5. 模板 - 树上问题(树的直径、动态查询树的直径、树的重心)

    整理的算法模板合集: ACM模板 目录 一.树的直径 树形DP 两次DFS / BFS(找到直径的两个端点) 二.动态修改树的边权并求每个时刻的直径(线段树) 三.树的重心 一.树的直径 树的直径满足 ...

  6. 牛客 - 王国(虚树+树的直径)

    题目链接:点击查看 题目大意:给出 n 个点组成的一棵树,每个节点都有一个权值,现在规定权值相同的节点之间,简单路径的边数为 x ,求 x * x 的最大值 题目分析:真的很巧,上周刚学的虚树,读完这 ...

  7. 求树的直径的两种方法

    树的直径 树型dp求树的直径 优缺点: 优点为可以处理边权为负的情况,但不易得到直径的路径(指树的直径经过什么点). 代码模板: #include<bits/stdc++.h> using ...

  8. 树的直径,树的重心,树的分冶

    主要是利用了反证法: 假设 s-t这条路径为树的直径,或者称为树上的最长路 现有结论,从任意一点u出发搜到的最远的点一定是s.t中的一点,然后在从这个最远点开始搜,就可以搜到另一个最长路的端点,即用两 ...

  9. [USACO09FEB]庙会班车Fair Shuttle 线段树维护maxx贪心

    [USACO09FEB]庙会班车Fair Shuttle 线段树维护maxx&&贪心 题目描述 Although Farmer John has no problems walking ...

最新文章

  1. iOS 注册密码加密 添加了时间戳 遇到的问题...
  2. RCNN (Regions with CNN) 目标物检测 Fast RCNN的基础
  3. 推荐经典算法实现之BPMF(python+MovieLen)
  4. Python之tkinter:动态演示调用python库的tkinter带你进入GUI世界(Menu的Command)
  5. 脚本错误和安全警报怎么解决_适用于应用程序错误的AWS警报
  6. Day47 Django基础部分、路由配置、空间名称
  7. 前端学习(2996):vue+element今日头条管理--代码测试规范
  8. javax.management.InstanceNotFoundException: org.springframework.boot:type=Admin,name=SpringApplicati
  9. Linux基本的网络配置
  10. 这是我的卡,去买个包吧
  11. RabbitMQ学习之队列监控
  12. 编译ElasticFusion过程(Ubuntu14.04)
  13. dw文件html代码预览效果,VSCode设置网页代码实时预览
  14. 计算机毕业设计Java医院医患管理系统(系统+源码+mysql数据库+Lw文档)
  15. 计算机考研专业课靠什么意思,计算机考研专业课831什么意思???
  16. android camera慢动作,慢动作相机app下载-慢动作相机软件 安卓版v1.1-PC6安卓网
  17. Golang后端开发学习之路
  18. 【飞桨】GAN:U-GAT-IT【2020 ICLR】论文研读
  19. 那些年,年我们一起看过的大风车——HTML5风车效果
  20. 币安智能链监听日志事件

热门文章

  1. 视频培训网站发布问题
  2. [转]Git详解之五 分布式Git
  3. linux下性能监控工具
  4. ABP官方文档翻译 0.0 ABP官方文档翻译目录
  5. Angular面试从喜剧到悲剧的十个问题
  6. 使用fprintf()函数格式化输出至磁盘文件和是stdout
  7. Jenkins 部署
  8. [转载]AIX 上 Lotus Domino 的内存使用
  9. XLS封装成EXE制作全攻略
  10. AWS推出深度学习容器,简化AI程序开发