题目链接:树的高度
用并查集的方法做的。
这个题不是表述有问题,就是测试数据有问题。题目说了是合法的二叉树,但是测试数据是有多叉树的。
要把多余的树枝砍掉,就是说如果这个结点出现了第三个孩子,我们就不要去考虑第三个孩子。
并查集的思路就是构造出这么一棵树,然后如果出现第三个孩子及以上,把它标记出来,搜索的时候,搜索到这个孩子的时候就认为不合法。
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1e6+5;
int fa[maxn];
int child[maxn];
int vis[maxn];
int dfs(int i);
void init() //初始化
{
for(int i=0;i<maxn;++i)
{
fa[i]=i; //一开始让所有的节点都做自己的父亲
child[i]=0; //表示这个节点有多少个孩子
vis[i]=0; //1表示这个节点是不合法的,0表示是合法的
}
}
void join(int x,int y) //x是y的父亲
{
child[x]++; //x的孩子数加1
if(child[x]>=3) //如果孩子的节点数大于等于3,则表示这个孩子不合法
{
vis[y]=1; //因为不合法,所以标记一下
return ;
}
fa[y]=x; //让y的父亲是x
return ;
}
int main()
{
int n,x,y;
while(cin>>n)
{
init();
for(int i=0;i<n-1;i++)
{
cin>>x>>y;
join(x,y);
}
int big_num=0,a; //big_num表示树的高度,a表示每个节点的高度
for(int i=0;i<n-1;i++)
{
a=dfs(i);
big_num=big_num>a?big_num:a; //如果这个节点比以前的都大,则更新答案
}
cout<<big_num<<endl;
}
return 0;
}
int dfs(int i) //对i这个节点进行搜索
{
int tree_len=1; //初始化该节点的高度为1
int t=i;
while(t!=fa[t]) //如果t不是根节点本身
{
t=fa[t]; //则访问它的父亲节点
tree_len++; //树的长度+1
}
if(vis[t]) return 0;//如果该节点不合法,直接返回长度0
return tree_len;
}