HihoCoder-1050 【裸树的直径】

来源:互联网 发布:淘宝店铺怎么取消推广 编辑:程序博客网 时间:2024/06/05 20:14

题目地址
解释 :
求树的最长路(树的直径)
首先假设树的最长路的两个叶子节点为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);    //输出长度.}
原创粉丝点击