loj10155:数字转换:树的直径问题
题目连接
题目大意
- 一个数字n,求n以内的数字之间 “约数和关系” 的最长链;
- 约数和关系:一个数字 xxx 的约数和为 s[x]s[x]s[x] ;
题目分析
- 由 约数和关系 可以想到,如果 s[x]<xs[x]<xs[x]<x ,他们之间可以连一条双向边;题目就转换为了一个树上,求直径。
- 直径的定义: 树上最长的链。
- 求树的直径的方法1:用两次dfs来完成
dfs1dfs1dfs1 从根出发,找到最远的叶子结点 kkk;
dfs2dfs2dfs2 以 kkk 为根,出发,找到离他最远的点 ttt , kkk 与 ttt 之间的距离就是直径。 - 求直径的做法2:dp的思维来实现
搜索的过程中,同时记录最长链与次长链,回溯的时候更新。
解题思路1:两次 dfsdfsdfs 求直径
- 如果 s[x]<xs[x]<xs[x]<x ,他们之间可以连一条双向边;
- dfs1dfs1dfs1 从根出发,找到最远的叶子结点 kkk;
- dfs2dfs2dfs2 以 kkk 为根,出发,找到离他最远的点 ttt , kkk 与 ttt 之间的距离就是直径。
参考代码1
//loj10155-数字转换
//求树的直径-两次dfs求法
#include<bits/stdc++.h>
using namespace std;
const int N=500007;
struct node{int nex,to;
}e[N];
int n,ans,su[N];
int nx,lx; //第一次的最远点和最远距离
bool b[N];int las[N],cnt;
void add(int x,int y){cnt++;e[cnt].nex=las[x];e[cnt].to=y;las[x]=cnt;
}
void dfs1(int x,int c){ //找到最远距离的点 nx if(c>lx){lx=c;nx=x;}b[x]=1;for(int i=las[x];i;i=e[i].nex){int y=e[i].to;if(!b[y]) dfs1(y,c+1);}b[x]=0;
}
void dfs2(int x,int c){ //从nx出发,找反向最远点 ans=max(ans,c);b[x]=1;for(int i=las[x];i;i=e[i].nex){int y=e[i].to;if(!b[y]) dfs2(y,c+1);}b[x]=0;
}
int main(){cin >> n;for(int i=1;i<=n;i++){ //求约数和 for(int j=2;j*i<=n;j++){su[j*i]+=i;} }for(int i=2;i<=n;i++){ //构图 if(i>su[i]){add(i,su[i]);add(su[i],i);}}dfs1(1,0);dfs2(nx,0);cout << ans;return 0;
}
解题思路2: dpdpdp 求直径
- 因为题面要求,对于xxx的约数和 s[x]<xs[x]<xs[x]<x ,所以可以设定 s[x]s[x]s[x] 为父亲节点, xxx 为子节点。
- dp的思维来实现
搜索的过程中,同时记录最长链 d1[x]d1[x]d1[x] 与次长链 d2[x]d2[x]d2[x],回溯的时候更新。 - 因为这是一棵不确定根的树,所以最后扫描一次所有的点,记录最大的 d1[x]+d2[x]d1[x]+d2[x]d1[x]+d2[x] 就是答案。
参考代码2
//loj10155-数字转换
//求树的直径-dp求法
#include<bits/stdc++.h>
using namespace std;
const int N=500007;int n,ans,su[N];
int d1[N],d2[N];int main(){cin >> n;for(int i=1;i<=n;i++){ //求约数和 for(int j=2;j*i<=n;j++){su[j*i]+=i;} }// s[y] --> y 是 父亲到儿子的树边 for(int y=n;y>=1;y--){if(su[y]>=y) continue; //约数和必须小于原数 int x=su[y];if(d1[x]<d1[y]+1){ d2[x]=d1[x]; //更新次长边 d1[x]=d1[y]+1; //更新最大边 } else if(d2[x]<d1[y]+1)d2[x]=d1[y]+1; //更新次长链 }for(int i=1;i<=n;i++) if(d1[i]+d2[i]>ans) ans=d1[i]+d2[i];cout << ans;return 0;
}
loj10155:数字转换:树的直径问题相关推荐
- $Loj10155$ 数字转换(求树的最长链) 树形$DP$
loj Description 如果一个数x的/约数和/y(不包括他本身)比他本身小,那么x可以变成y,y 也可以变成x.限定所有数字变换在不超过n的正整数范围内进行,求不断进行数字变换且不出现重复数 ...
- LOJ10155数字转换
题目描述 如果一个数 x 的约数和 y (不包括他本身)比他本身小,那么 x 可以变成 y,y 也可以变成 x.例如 4 可以变为 3,1 可以变为 7.限定所有数字变换在不超过 n 的正整数范围内进 ...
- loj10155 数字转换
题目描述 如果一个数 x的约数和 y (不包括他本身)比他本身小,那么 x 可以变成 y,y也可以变成 x.例如 4 可以变为 3,1 可以变为 7.限定所有数字变换在不超过 n 的正整数范围内进行, ...
- LOJ10155 一本通1577 数字转换 题解
目录 题面 题面分析 初读题面 深入分析 得出答案 树形DP做法 树形DP模板(仅供参考) 搜索做法 搜素BFS模板(仅供参考) 代码 题面 一本通 LOJ 题面分析 初读题面 如果一个数 xxx 的 ...
- 【leetcode-DFS】求根节点到叶节点数字之和/二叉树的最大路径和/路径总和/左叶子之和/树的直径
文章目录 求根节点到叶节点数字之和 深度优先搜索 广度优先搜索 二叉树的最大路径和 DFS 路径总和1 深度优先搜索 广度优先搜索 路径总和2 回溯法 广度优先搜索 左叶子之和 递归 DFS 树的直径 ...
- [51nod] 1766树上的最远点对 树的直径 树剖LCA+ST表静态查询
题意: 给你一棵带权树,q次查询,每次给出两个区间,[l1,r1][l2,r2][l_1,r_1] [l_2,r_2][l1,r1][l2,r2]从这两个区间中分别选择两个数字,使得这两个点的 ...
- HDU - 4612 Warm up(边双缩点+树的直径)
题目链接:点击查看 题目大意:给出一个由n个点和m条边构成的无向图,现在允许加一条边,使得整张图中桥的数量最少,求最少的桥的数量 题目分析:因为是要求桥,所以直接用tarjan边双缩点,将原图转换成一 ...
- 【POJ - 3310】Caterpillar(并查集判树+树的直径求树脊椎(bfs记录路径)+dfs判支链)
题干: An undirected graph is called a caterpillar if it is connected, has no cycles, and there is a pa ...
- 数字转换 LibreOJ - 10155
数字转换 LibreOJ - 10155 题目 题解 AC代码 链接: 原题地址. 题目 如果一个数 x 的约数(不包括他本身)的和 y 比他本身小,那么 x 可以变成 y,y 也可以变成 x.例如 ...
最新文章
- Go处理百万每分钟的请求
- 面试官:你们Redis故障过吗,怎么解决?
- Windows 10 [ ERROR ] Can not init Myriad device: NC_ERROR Error
- PAT甲级1154 Vertex Coloring :[C++题解]图论、模拟、结构体存边
- 微服务治理之Eureka--源码浅析
- CentOS 5.5编译安装lnmp
- Tensorflow saved_model.pb 文件转成 saved_model.pbtxt文件
- 转换YV12到RGB565图像转换,附YUV转RGB测试
- jzxx2600野猫过生日
- Spring Boot整合MyBatis框架(完整的注解版)
- 输入任意字符,若是小写则变为大写字母,否则原样输出
- 数据结构课设——计算器
- 成功操盘手必经的5个阶段
- 2021-06-18四种方法帮你排除电磁兼容测试故障
- exynos4412驱动程序教程.0
- Centos7搭建SpringBlade的前端Saber
- 喜闻乐见的 2048 游戏 (附源码)
- 从月薪3千到3万,需要努力多久?
- development 和 production 模式的区别
- 用正则表达式实现的计算器
热门文章
- PPT中正文和标题字体的选择技巧
- 高通QCA6174A WiFi/蓝牙二合一芯片
- Redis中的布隆过滤器与布谷鸟过滤器,你了解多少?
- 计算机怎么解除c盘用户权限,电脑c盘文件夹拒绝访问怎么办 删除c盘文件如何获得管理员权限...
- 很多人大一就开始学习C语言,你真的学到了吗?
- 论文笔记 EMNLP 2021|Modeling Document-Level Context for Event Detection via Important Context Selection
- 机器学习和数据科学的最佳公共数据集
- 限幅二极管基础知识详解
- 【UEFI实战】SlimBootloader中调用FSP
- 天下难事,必作于易;天下大事,必作于细。