博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
1021 Deepest Root
阅读量:7082 次
发布时间:2019-06-28

本文共 1343 字,大约阅读时间需要 4 分钟。

这道题的关键在于如何求两个最远的结点,二叉树比较容易一直DFS就能找到,但是普通树就比较麻烦。要先找到一端,再去找另外一端,两端的并集就是答案。因为结点都是对称的,所以两端都是答案。还要注意去重,12 13这种就会重复。

#include
using namespace std;const int maxn = 10010;vector
pre[maxn];int n;bool vis[maxn];vector
ans;void DFS(int s){ int i; vis[s] = true; for (i =0;i
temp;int maxh = 0;void find(int s,int height)//寻找以s为根距离s最远的结点,height为s距离该节点的距离.{ if (vis[s] == true) return; vis[s] = true; if (height > maxh) { temp.clear(); temp.push_back(s); maxh = height; } else if (height == maxh) { temp.push_back(s); } int i; for (i = 0; i < pre[s].size(); i++) { find(pre[s][i], height + 1); }}int main(){ scanf("%d", &n); int i, j; for (i = 1; i <= n-1; i++) { int st, ed; scanf("%d %d", &st,&ed); pre[st].push_back(ed); pre[ed].push_back(st); } memset(vis, false, sizeof(vis)); int sum = 0; for (i = 1; i <= n; i++) { if (vis[i] == false) { sum++; DFS(i); } } if (sum >=2) { printf("Error: %d components\n", sum); } else if (n == 1) { printf("%d\n", 1); } else { memset(vis, false, sizeof(vis)); find(1, 0);//此时temp里面已经装了若干边缘结点 ans = temp; memset(vis, false, sizeof(vis)); maxh = 0; temp.clear(); find(ans[0], 0); for (i = 0; i < temp.size(); i++) { ans.push_back(temp[i]); } sort(ans.begin(), ans.end()); printf("%d\n", ans[0]); for (i = 1; i

 

转载于:https://www.cnblogs.com/legendcong/p/9512474.html

你可能感兴趣的文章
Windows系统中 五大免费开源的SVN工具
查看>>
排序规则引起的冲突问题
查看>>
我的友情链接
查看>>
onTouch事件传递机制
查看>>
那些年的坑--双精度数值转成整形
查看>>
office 2007各种格式附件下载后变成zip文件问题解决方法
查看>>
宽依赖、窄依赖
查看>>
好程序员web前端系列之CSS3-3D
查看>>
xm 命令详解
查看>>
HttpClient4.x send json request
查看>>
mysql5.6基于GTID的主从复制
查看>>
iOS 获取Wifi的SSID及MAC地址
查看>>
认识六个被误解的Ruby特性
查看>>
Java线程:并发协作-生产者消费者模型
查看>>
libvirt API非阻塞调用及相关的原理分析
查看>>
老男孩第十四期Python学习班之Day06
查看>>
更改sql 数据库 SA密码 找不到sp_password存储过程
查看>>
破解软件注册码
查看>>
使用iptables应对SYN***、CC***、ACK***
查看>>
NO.9 用禅道项目管理软件创建第一个产品
查看>>