\[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. mysql oracle sql获取树 父级 子级 及自己

    select * from ( select t.*,d.TABLE_NAME,d.QUERY_SQL,d.data_control_col,d.id table_id,d.where_sql fro ...

  2. PHP-FPM 远程代码执行漏洞(CVE-2019-11043)的简单复现学习

    1.概述 漏洞主要由于 PHP-FPM 中 sapi/ fpm/ fpm/ fpm_main.c 文件内的 env_path_info 下溢导致,攻击者可以使用换行符 %0a 破坏 Nginx 中 f ...

  3. cogs 1298. 通讯问题 Tarjan

    1298. 通讯问题 ★★   输入文件:jdltt.in   输出文件:jdltt.out   简单对比时间限制:1 s   内存限制:128 MB [题目描述] 一个篮球队有n个篮球队员,每个队员 ...

  4. dp-最长回文串

    博客 : http://blog.csdn.net/hao_zong_yin/article/details/72730732 问题描述: 求一个序列中的最长回文串,这个串可以不连续 , 如  { 1 ...

  5. SpringCloud组件和概念介绍(一)

    一:什么是微服务(Microservice) 微服务英文名称Microservice,Microservice架构模式就是将整个Web应用组织为一系列小的Web服务.这些小的Web服务可以独立地编译及 ...

  6. Logback源码分析

    在日常开发中经常通过打印日志记录程序执行的步骤或者排查问题,如下代码类似很多,但是,它是如何执行的呢? package chapters; import org.slf4j.Logger; impor ...

  7. git 工作中实用合并分支

    合并分支 .克隆远程分支 git clone -b dev1. url .创建本地分支,并关联远程分支 git checkout -b dev_wt orgin/dev_wt .合并某分支到当前分支 ...

  8. python 继承机制(子类化内置类型)

    1. 如果想实现与某个内置类型具有类似行为的类时,最好的方法就是将这个内置类型子类化. 2. 内置类型子类化,其实就是自定义一个新类,使其继承有类似行为的内置类,通过重定义这个新类实现指定的功能. c ...

  9. [uoj#34] [洛谷P3803] 多项式乘法(FFT)

    新技能--FFT. 可在 \(O(nlogn)\) 时间内完成多项式在系数表达与点值表达之间的转换. 其中最关键的一点便为单位复数根,有神奇的折半性质. 多项式乘法(即为卷积)的常见形式: \[ C_ ...

  10. 手势识别控制pygame精灵

    步骤: 编写简易pygame精灵游戏(只实现键盘上下左右控制) 解决opencv手势识别核心问题 上述2部分对接上 pygame部分我们只加载个背景,然后里面放1只乌龟精灵,用键盘的上下左右键来控制, ...