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;
 }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值