题目:
分析:
没思路,直接盗取大佬的吧、
首先明确,结果的个数不是1就是2.
每次都把叶子节点全部去掉,那么相当于最大高度少了1,层层拨开,那么最后剩的一个或者两个就是结果了。
用矩阵表示树吧,这样,只遍历所在行即可,只有1个1个是当前的叶子节点。
代码(超时了):
int n;
vector<vector<int> > e;
//矩阵表示树 0表示不相邻
vector<vector<int> > A(n,vector<int> (n,0));
for(int i=0;i<e.size();i++)
{
A[e[i][1]][e[i][0]]=A[e[i][0]][e[i][1]]=1;
}
vector<int> result;
while(1)
{
vector<vector<int> > A2=A;
for(int i=0;i<A.size();i++)
{
int c=0;
//看有几个
for(int j=0;j<A[0].size();j++)
{
if(A[i][j]==1){
c++;
}
}
//1个的话删了
if(c==1)
{
for(int j=0;j<A[0].size();j++)
{
if(A[i][j]==1){
A2[i][j]=0;
A2[j][i]=0;
v.push_back(i);
v.push_back(j);
}
}
}
}
int all=0;
for(int i=0;i<A.size();i++)
for(int j=0;j<A[0].size();j++) if(A2[i][j]) all++;
if(all==0)
{
int maxx=0;
for(int i=0;i<A.size();i++)
{
int c=0;
for(int j=0;j<A[0].size();j++)
{
if(A[i][j]) c++;
}
maxx=max(maxx,c);
}
vector<int> v;
for(int i=0;i<A.size();i++)
{
int c=0;
for(int j=0;j<A[0].size();j++)
{
if(A[i][j]) c++;
}
if(c==maxx) v.push_back(i);
}
return v;
}
A=A2;
}