题目链接:
这题主要是叫我们求出树的直径,在求树的直径之前要先判断一下有没有环
树的直径指的就是一棵树上面距离最远的两点的距离,有时也可以指最远的两点之间的路径。
至于树的直径怎么求,我们首先要知道一个结论,树上面随便取一点,离这一点最远的那个点一定是树的直径上面的两点中的一点
证明的博客:
知道了这个结论,我们就可以用两次dfs或者两次bfs来求出树的直径,第一次bfs我们随便拿树上的一个点进行bfs,去找到离他最远的一点,这样我们就找到了树的直径两端上面的一点,然后第二次bfs就以这一点为开始去找到离这一点距离最大的点,得到的这这个点就树的直径两端的另外一个点,这两点之间的距离就是树的直径。
思路:首先我们要判断是否有环,这里用的是并查集,一旦给出的树边上的两点已经在一个集合里面了,说明之前这两点之间就有一条互通的路径,所以加上增加的这条树边就构成了一个环。然后注意这题给出的数据不一定只是一颗树,可能是森林,所以可能有多个树的直径,我们取最大值。
我的代码写的不是很好,绝对不是最优的,仅供参考。
bfs写的代码:
#include #include #include #include #include
ss;//因为可能给的数据是森林,不一定是只有一棵树,所以我把每颗树里面 //离树根最远的点存进栈里面 for(int i=1;i<=n;i++){ if(vis[i]) continue; max1=0; bfs(i); ss.push(point); } int ans=0; memset(vis,0,sizeof(vis)); memset(dis,0,sizeof(vis)); while(!ss.empty()){ //再用栈里面的点来进行第二次bfs找到树的直径的另外一个点和树的直径 point=ss.top(); ss.pop(); max1=0; bfs(point); ans=max(max1,ans); } printf("%d\n",ans); } return 0;}
#include #include #include #include #include