leetcode:310. 最小高度树(广搜)

题目:

在这里插入图片描述

分析:

没思路,直接盗取大佬的吧、
首先明确,结果的个数不是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;
 }
发布了196 篇原创文章 · 获赞 126 · 访问量 4673

猜你喜欢

转载自blog.csdn.net/weixin_42721412/article/details/104494375