题目连接


题目大意

  • 一个数字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:数字转换:树的直径问题相关推荐

  1. $Loj10155$ 数字转换(求树的最长链) 树形$DP$

    loj Description 如果一个数x的/约数和/y(不包括他本身)比他本身小,那么x可以变成y,y 也可以变成x.限定所有数字变换在不超过n的正整数范围内进行,求不断进行数字变换且不出现重复数 ...

  2. LOJ10155数字转换

    题目描述 如果一个数 x 的约数和 y (不包括他本身)比他本身小,那么 x 可以变成 y,y 也可以变成 x.例如 4 可以变为 3,1 可以变为 7.限定所有数字变换在不超过 n 的正整数范围内进 ...

  3. loj10155 数字转换

    题目描述 如果一个数 x的约数和 y (不包括他本身)比他本身小,那么 x 可以变成 y,y也可以变成 x.例如 4 可以变为 3,1 可以变为 7.限定所有数字变换在不超过 n 的正整数范围内进行, ...

  4. LOJ10155 一本通1577 数字转换 题解

    目录 题面 题面分析 初读题面 深入分析 得出答案 树形DP做法 树形DP模板(仅供参考) 搜索做法 搜素BFS模板(仅供参考) 代码 题面 一本通 LOJ 题面分析 初读题面 如果一个数 xxx 的 ...

  5. 【leetcode-DFS】求根节点到叶节点数字之和/二叉树的最大路径和/路径总和/左叶子之和/树的直径

    文章目录 求根节点到叶节点数字之和 深度优先搜索 广度优先搜索 二叉树的最大路径和 DFS 路径总和1 深度优先搜索 广度优先搜索 路径总和2 回溯法 广度优先搜索 左叶子之和 递归 DFS 树的直径 ...

  6. [51nod] 1766树上的最远点对 树的直径 树剖LCA+ST表静态查询

    题意: 给你一棵带权树,q次查询,每次给出两个区间,[l1,r1][l2,r2][l_1,r_1] [l_2,r_2][l1​,r1​][l2​,r2​]从这两个区间中分别选择两个数字,使得这两个点的 ...

  7. HDU - 4612 Warm up(边双缩点+树的直径)

    题目链接:点击查看 题目大意:给出一个由n个点和m条边构成的无向图,现在允许加一条边,使得整张图中桥的数量最少,求最少的桥的数量 题目分析:因为是要求桥,所以直接用tarjan边双缩点,将原图转换成一 ...

  8. 【POJ - 3310】Caterpillar(并查集判树+树的直径求树脊椎(bfs记录路径)+dfs判支链)

    题干: An undirected graph is called a caterpillar if it is connected, has no cycles, and there is a pa ...

  9. 数字转换 LibreOJ - 10155

    数字转换 LibreOJ - 10155 题目 题解 AC代码 链接: 原题地址. 题目 如果一个数 x 的约数(不包括他本身)的和 y 比他本身小,那么 x 可以变成 y,y 也可以变成 x.例如 ...

最新文章

  1. Go处理百万每分钟的请求
  2. 面试官:你们Redis故障过吗,怎么解决?
  3. Windows 10 [ ERROR ] Can not init Myriad device: NC_ERROR Error
  4. PAT甲级1154 Vertex Coloring :[C++题解]图论、模拟、结构体存边
  5. 微服务治理之Eureka--源码浅析
  6. CentOS 5.5编译安装lnmp
  7. Tensorflow saved_model.pb 文件转成 saved_model.pbtxt文件
  8. 转换YV12到RGB565图像转换,附YUV转RGB测试
  9. jzxx2600野猫过生日
  10. Spring Boot整合MyBatis框架(完整的注解版)
  11. 输入任意字符,若是小写则变为大写字母,否则原样输出
  12. 数据结构课设——计算器
  13. 成功操盘手必经的5个阶段
  14. 2021-06-18四种方法帮你排除电磁兼容测试故障
  15. exynos4412驱动程序教程.0
  16. Centos7搭建SpringBlade的前端Saber
  17. 喜闻乐见的 2048 游戏 (附源码)
  18. 从月薪3千到3万,需要努力多久?
  19. development 和 production 模式的区别
  20. 用正则表达式实现的计算器

热门文章

  1. PPT中正文和标题字体的选择技巧
  2. 高通QCA6174A WiFi/蓝牙二合一芯片
  3. Redis中的布隆过滤器与布谷鸟过滤器,你了解多少?
  4. 计算机怎么解除c盘用户权限,电脑c盘文件夹拒绝访问怎么办 删除c盘文件如何获得管理员权限...
  5. 很多人大一就开始学习C语言,你真的学到了吗?
  6. 论文笔记 EMNLP 2021|Modeling Document-Level Context for Event Detection via Important Context Selection
  7. 机器学习和数据科学的最佳公共数据集
  8. 限幅二极管基础知识详解
  9. 【UEFI实战】SlimBootloader中调用FSP
  10. 天下难事,必作于易;天下大事,必作于细。