HihoCoder-1050 【裸树的直径】
2017-06-20 23:05
309 查看
题目地址
解释 :
求树的最长路(树的直径)
首先假设树的最长路的两个叶子节点为v1,v2,那么现有结论,从任意一点u出发走到的最远的点一定是(v1,v2)中的一点,然后
再从v1或者v2出发走到的最远点一定是v2或者v1。所以经过两次搜索就能找到最长路径.
相关证明
AC代码:
dfs 找节点
解释 :
求树的最长路(树的直径)
首先假设树的最长路的两个叶子节点为v1,v2,那么现有结论,从任意一点u出发走到的最远的点一定是(v1,v2)中的一点,然后
再从v1或者v2出发走到的最远点一定是v2或者v1。所以经过两次搜索就能找到最长路径.
相关证明
AC代码:
dfs 找节点
#include<cstdio> #include<vector> #include<cstring> #define CLR(x) memset(x,0,sizeof(x)) using namespace std; const int maxn=1e5+5; int dep[maxn]; int max_len,root,n; int vis[maxn]; vector<int>ve[maxn]; int dfs(int x,int len) { vis[x]=1; if(len >max_len) max_len=len,root=x; for(int i=0;i<ve[x].size();i++){ if(!vis[ve[x][i]]){ dfs(ve[x][i],len+1); } } } int main() { scanf("%d",&n); for(int i=0;i<n-1;i++){ int u,v; scanf("%d%d",&u,&v); ve[u].push_back(v); ve[v].push_back(u); } max_len=0; CLR(vis); dfs(1,0); //找到叶子结点之一,也许是最远. CLR(vis); dfs(root,0); //以一个叶子结点开始搜素,则搜出来的长度一定是最长. printf("%d\n",max_len); //输出长度. }
相关文章推荐
- Hihocoder 1050 树中的最长路(树的直径 两次dfs/折点)
- 第七周:[hihocoder]#1050 : 树中的最长路
- [hihocoder 1050]求树的最长链
- hihocoder 1050
- hihocoder1050 : 树中的最长路
- hiho 1050 树中的最长路 (树的直径)
- [HIHO1050]树中的最长路(树直径)
- hihoCoder 1050 树中的最长路 题解
- DFS序+线段树 hihoCoder 1381 Little Y's Tree(树的连通块的直径和)
- Hiho #1050 : 树中的最长路 【树的直径】
- 树的直径(图中最长路)——hiho 1050
- hihocoder 1050
- hihoCoder1050— 树中的最长路(深搜)
- hihocoder1050 树中的最长路径
- [hihocoder1050]树中的最长路
- hihocoder(1050) 树中最长路径
- hihoCoder 1050 : 树中的最长路 (dfs)
- hihocoder 1050 树中的最长路(动态规划,dfs搜索)
- 分治 hihoCoder1050 树中的最长路
- hiho 1050 树中的最长路 (树的直径)