hihocoder第十一周树中的最长路
2015-02-18 13:00
176 查看
题目
解法
输入
每个测试点(输入文件)有且仅有一组测试数据。
每组测试数据的第一行为一个整数N,意义如前文所述。
每组测试数据的第2~N行,每行分别描述一根木棍,其中第i+1行为两个整数Ai,Bi,表示第i根木棍连接的两个小球的编号。
对于20%的数据,满足N<=10。
对于50%的数据,满足N<=10^3。
对于100%的数据,满足N<=10^5,1<=Ai<=N, 1<=Bi<=N
输出
对于每组测试数据,输出一个整数Ans,表示给出的这棵树中距离最远的两个结点之间相隔的距离。
这样一来,后续遍历即可。一边就可以找到最远距离。
题目中不同的是,不是二叉树,是多叉树。在表示多叉树关系式,像图一样来表示,用邻接表法。在遍历时,随便以一个结点为根节点,后续遍历即可。因为是多叉树,在求其子树最大深度时,要用两个变量first和second,表示最大深度和次大深度。因为可能有第三个子树深度大于first,这时最大深度first和second都要更新。如果只是大于次大深度second,只需要更新second。
编码测试:
解法
题目
N个结点,用(N-1)个线段连接起来,组成一棵树。求这棵树种,相距最远的两个结点的距离。输入
每个测试点(输入文件)有且仅有一组测试数据。
每组测试数据的第一行为一个整数N,意义如前文所述。
每组测试数据的第2~N行,每行分别描述一根木棍,其中第i+1行为两个整数Ai,Bi,表示第i根木棍连接的两个小球的编号。
对于20%的数据,满足N<=10。
对于50%的数据,满足N<=10^3。
对于100%的数据,满足N<=10^5,1<=Ai<=N, 1<=Bi<=N
输出
对于每组测试数据,输出一个整数Ans,表示给出的这棵树中距离最远的两个结点之间相隔的距离。
解法
这个题目很像二叉树中,求距离最远的两个结点的距离。在求解时,递归求解每个结点的最大深度,假设左子树深度为L,右子树深度为R,那么经过这个结点的,且以这个结点为根节点的子树中,最远两个结点的距离为L+R。且其父节点的左子树(或右子树)的最大深度为max(L,R)。这样一来,后续遍历即可。一边就可以找到最远距离。
题目中不同的是,不是二叉树,是多叉树。在表示多叉树关系式,像图一样来表示,用邻接表法。在遍历时,随便以一个结点为根节点,后续遍历即可。因为是多叉树,在求其子树最大深度时,要用两个变量first和second,表示最大深度和次大深度。因为可能有第三个子树深度大于first,这时最大深度first和second都要更新。如果只是大于次大深度second,只需要更新second。
编码测试:
#include<iostream> #include<vector> #include<algorithm> int maxDistance = 0; std::vector<std::vector<int> > G(100001);//存储边信息 inline void AddEdge(int v, int s)//把结点v和s关联 { G[v].push_back(s); G[s].push_back(v); } int LastOrder(int pre, int cur) { int first = 0, second = 0;//最大值和次大值 for (size_t i = 0; i < G[cur].size(); ++i) { if (G[cur][i] == pre)//一直向下,不着重复的边 continue; int temp = LastOrder(cur, G[cur][i]);//向下找 if (temp>first) { second = first; first = temp; } else if (temp > second) { second = temp; } } maxDistance = std::max(maxDistance, first + second); return first + 1; } int main() { int N; std::cin >> N; int Ai, Bi; for (int i = 1; i < N; ++i) { std::cin >> Ai >> Bi; AddEdge(Ai, Bi); } LastOrder(0, 1); std::cout << maxDistance; return 0; }
相关文章推荐
- Hihocoder 1050 树中的最长路(树的直径 两次dfs/折点)
- hihocoder 1050 树中的最长路(动态规划,dfs搜索)
- hihoCoder1050— 树中的最长路(深搜)
- hihocoder1050 : 树中的最长路
- hihoCoder 1050 树中的最长路 题解
- hihocoder#1050之树中最长路
- hihoCoder 1050 树中的最长路
- 树中的最长路(hihocoder 第十一周)
- HihoCoder第十一周:树中的最长路
- hihoCoder 树中的最长路
- hihocoder-第十一周 树中的最长路
- HihoCoder第十一周:树中的最长路
- hihocoder-1050 树中的最长路(dfs)
- 第七周:[hihocoder]#1050 : 树中的最长路
- hihocoder#1050之树中最长路
- 分治 hihoCoder1050 树中的最长路
- [hihocoder1050]树中的最长路
- HDU 6201 transaction transaction transaction (最长路)
- hihocoder1075【开锁魔法】
- hdu 3666 THE MATRIX PROBLEM (差分约束 + 最长路)