您的位置:首页 > 其它

HihoCoder-1050 【裸树的直径】

2017-06-20 23:05 309 查看
题目地址

解释 :

求树的最长路(树的直径)

首先假设树的最长路的两个叶子节点为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);    //输出长度.
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: