\[Preface
\]

打比赛的时候先开了 F 题(雾

然后一眼看出 F 题结论,最后居然因为没有判重,交了三次才过。

\[Description
\]

给出一棵无权树(可理解为边权为 \(1\) ),你需要选取三个点 \(a,b,c\) ,最大化 \(a,b\) 和 \(b,c\) 和 \(a,c\) 的简单路径的并集的长度。

输出这个最大长度和 \(a,b,c\) 。

\[Solution
\]

有一个结论:

必定会有一组最优解,使得 \(a,b\) 是树直径上的端点。

这个结论我现在暂时不会证明,大家可以去看看其他 \(dalao\) 的证明或是自己给出证明 \(>v<\) 。

\(~\)

那我们可以套路地去把树直径两端点求出来,这里不推荐用 树形dp ,推荐大家用 两次搜索 求出树直径端点。

确定了 \(a,b\) ,接下来我们只要去找到最优的 \(c\) ,就可以最大化答案了。

此时我们注意到:\(a,b\) 和 \(b,c\) 和 \(a,c\) 的简单路径的并集的长度其实就是 \(\frac{dis(a,b)+dis(b,c)+dis(a,c)}{2}\) 。

此时 \(dis(a,b)\) 已经确定了,当 \(dis(b,c)+dis(a,c)\) 的值取到最大,那么整个式子取最大。

把 \(a,b\) 到所有点的简单路径距离求出来,去枚举这个最优的 \(c\) 即可,枚举的过程中记得判与 \(a,b\) 相同的情况。

\[Code
\]

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue> #define RI register int using namespace std; inline int read()
{
int x=0,f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-f;s=getchar();}
while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
return x*f;
} const int N=200100,M=400100; int n; int tot,head[N],ver[M],edge[M],Next[M]; void add(int u,int v,int w)
{
ver[++tot]=v; edge[tot]=w; Next[tot]=head[u]; head[u]=tot;
} int d[N],vis[N]; int pos; void bfs(int sta)
{
memset(d,0,sizeof(d));
memset(vis,0,sizeof(vis)); queue<int>q; q.push(sta);
vis[sta]=1; while(q.size())
{
int u=q.front();q.pop();
for(RI i=head[u];i;i=Next[i])
{
int v=ver[i],w=edge[i];
if(vis[v])continue;
d[v]=d[u]+w;
vis[v]=1;
if(d[v]>d[pos])pos=v;
q.push(v);
}
}
} int p1,p2;
int ans; int tmp1[N],tmp2[N]; int main()
{
n=read(); for(RI i=1;i<n;i++)
{
int u=read(),v=read();
add(u,v,1),add(v,u,1);
} bfs(1);
p1=pos; bfs(p1);
p2=pos; for(RI i=1;i<=n;i++)
tmp1[i]=d[i]; bfs(p2); for(RI i=1;i<=n;i++)
tmp2[i]=d[i]; pos=0;
for(RI i=1;i<=n;i++)
if(tmp1[i]+tmp2[i]>tmp1[pos]+tmp2[pos]&&i!=p1&&i!=p2)pos=i; ans=(tmp1[p2]+tmp1[pos]+tmp2[pos])/2; printf("%d\n",ans);
printf("%d %d %d\n",p1,p2,pos); return 0;
}

\[Thanks \ for \ watching
\]

题解 CF1294F 【Three Paths on a Tree】的更多相关文章

  1. hdu 4912 Paths on the tree(树链拆分+贪婪)

    题目链接:hdu 4912 Paths on the tree 题目大意:给定一棵树,和若干个通道.要求尽量选出多的通道,而且两两通道不想交. 解题思路:用树链剖分求LCA,然后依据通道两端节点的LC ...

  2. HDU 4912 Paths on the tree(LCA+贪心)

    题目链接 Paths on the tree 来源  2014 多校联合训练第5场 Problem B 题意就是给出m条树上的路径,让你求出可以同时选择的互不相交的路径最大数目. 我们先求出每一条路径 ...

  3. codeforce F - Three Paths on a Tree

    F. Three Paths on a Tree time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  4. CF741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths (dsu on tree) 题解

    先说一下dsu算法. 例题:子树众数问题. 给出一棵树,每个点有点权,求每个子树中出现次数最多的数的出现次数. 树的节点数为n,\(n \leq 500000\) 这个数据范围,\(O(n \sqrt ...

  5. CF 741D. Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths [dsu on tree 类似点分治]

    D. Arpa's letter-marked tree and Mehrdad's Dokhtar-kosh paths CF741D 题意: 一棵有根树,边上有字母a~v,求每个子树中最长的边,满 ...

  6. [LeetCode]题解(python):145-Binary Tree Postorder Traversal

    题目来源: https://leetcode.com/problems/binary-tree-postorder-traversal/ 题意分析: 后序遍历一棵树,递归的方法很简单,尝试用非递归的方 ...

  7. [LeetCode]题解(python):144-Binary Tree Preorder Traversal

    题目来源: https://leetcode.com/problems/binary-tree-preorder-traversal/ 题意分析: 前序遍历一棵树,递归的方法很简单.那么非递归的方法呢 ...

  8. [LeetCode]题解(python):124-Binary Tree Maximum Path Sum

    题目来源: https://leetcode.com/problems/binary-tree-maximum-path-sum/ 题意分析: 给定一棵树,找出一个数值最大的路径,起点可以是任意节点或 ...

  9. 【题解二连发】Construct Binary Tree from Inorder and Postorder Traversal & Construct Binary Tree from Preorder and Inorder Traversal

    LeetCode 原题链接 Construct Binary Tree from Inorder and Postorder Traversal - LeetCode Construct Binary ...

随机推荐

  1. 使用PE启动盘清空电脑登入密码

    1.PE启动盘制作过程 要制作一个启动盘可以使用很多工具来制作,比如老毛桃.U深度.大白菜等软件都可以制作PE启动盘.此处就用老毛桃制作PE启动盘为例(http://www.laomaotao.tv/ ...

  2. matlab读取excel文件中的数据

    1.读取sheet1中的所有数据 1.1首先我们建立一个sheet表,表名为‘111’ 1.2 默认这些文本以及数字都放在sheet1中,我们将此excel选入当前工作目录(必要步骤), 选入当前工作 ...

  3. 【Springboot】注解@ConfigurationProperties让配置整齐而简单

    1 简介 前面我们用一篇文章<[Spring]只想用一篇文章记录@Value的使用,不想再找其它了(附思维导图)> 详细讲解了在Spring中如何使用@Value来实现我们对配置的需求,它 ...

  4. 【转】ArcGIS Server 10.1 动态图层—更改风格

    在 ArcGIS Server REST API中我们可以通过向Graphicslayer中添加临时图元的方法来完成对显示结果的渲染:如果仅仅是更改原有地图服务显示风格,在ArcGIS10.1下使用动 ...

  5. python中property和setter装饰器

    property和setter装饰器 作用:调用方法改为调用对象, 比如 : p.set_name()     改为   p.set_name 区别:  前者改变get方法,后者改变set方法 效果图 ...

  6. 非关系数据库与redis安装

    1.什么是 NoSQL? NoSQL(NoSQL = Not Only SQL ),意为反 SQL 运动,是一项全新的数据库革命性运动,2000 年 前就有人提出,发展至 2009 年趋势越发高涨.它 ...

  7. numpy 读取数据

    一.CSV文件 CSV: Comma-Separated Value,逗号分隔值文件 显示:表格状态 源文件:换行和逗号分隔,逗号 列,换行 行 二.读取数据 1.方法 loadtxt(fname, ...

  8. 玩转Django2.0---Django笔记建站基础八(admin后台系统)

    第八章 admin后台系统 admin后台系统也成为网站后台管理系统,主要用于对网站前台的信息进行管理,如文字.图片.影音和其他日常使用文件的发布.更新.删除等操作,也包括功能信息的统计和管理,如用户 ...

  9. 微服务的多数据源配置: step 1

    spring boot + mybatis: 实现的功能点: 多数据源 jdbc: spring.datasource.test1.url = jdbc:mysql://localhost:3306/ ...

  10. NOI2019滚粗记

    Day -15 期末考完了,爆炸爆炸,就连数学和物理都错了好多傻*错误QwQ 哎呀管他的,NOI我来了! 跑到广附集训来了23333 Day -14 -- -2 做题,听题,哇和一群队爷在一个教室,真 ...