2013杭电warm up1 1002 Pet 求树结点的高度

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4707

题目给出一颗树,要求求出深度大于D的结点的个数。

有两种方法,改写dfs,给一个参数放层数(额,其实这里不需要转化为有根树,多于了)

代码:

#include<iostream>
#include<vector>
#include<cstdio>
#include<cstring>
using namespace std;

#define maxn 100005

vector<int>  G[maxn];
int p[maxn];
int lev[maxn];

//vector<int>  leaf;
void dfs(int u,int fa,int level)  // 无根树转化为有根树
{
    int d=G[u].size();
    // if(d==1&&u!=0)  leaf.push_back(u);    可行的改造   求出所有叶子结点
    lev[u]=level;

    for(int i=0;i<d;i++)
    {
       int v=G[u][i];
       if(v!=fa)dfs(v,p[v]=u,level+1);

    }

}

void init()
{
   for(int i=0;i<maxn;i++)
         G[i].clear();
//   leaf.clear();

   memset(p,0,sizeof(p));
   memset(lev,0,sizeof(lev));

}
int main()
{
    int T;
    cin>>T;
    int n,m;
    int a,b;
    int D;

    while(T--)
    {

       init();
        scanf("%d%d",&n,&D);
        for(int i=0;i<n-1;i++)
         {
             scanf("%d%d",&a,&b);
              G[a].push_back(b);
              G[b].push_back(a);
         }

       p[0]=-1;
       dfs(0,-1,0);

       int count=0;
       for(int i=0;i<n;i++)
         if(lev[i]>D)  count++;

       cout<<count<<endl;


    }
}

然后就是bfs方法   

#include<iostream>
#include<vector>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;

#define maxn 100005

vector<int>  G[maxn];
bool  vis[maxn];

int lev[maxn];

//vector<int>  leaf;

queue<int>  q;

void bfs(int u)
{
    q.push(u);


    while(q.empty()==false)
    {

         int k=q.front();
         vis[k]=1;
         q.pop();

         int size=G[k].size();

         for(int i=0;i<size;i++)
         {
            int v=G[k][i];

            if(!vis[v])
            {

               q.push(v);

               lev[v]=lev[k]+1;
            }
         }
    }

}


void init()
{
   for(int i=0;i<maxn;i++)
         G[i].clear();
//   leaf.clear()
   memset(vis,0,sizeof(vis));

   memset(lev,0,sizeof(lev));

}
int main()
{
    int T;
    cin>>T;
    int n,m;
    int a,b;
    int D;

    while(T--)
    {

        init();
        scanf("%d%d",&n,&D);
        for(int i=0;i<n-1;i++)
         {
             scanf("%d%d",&a,&b);
              G[a].push_back(b);
              G[b].push_back(a);
         }


        bfs(0);
       int count=0;
       for(int i=0;i<n;i++)
         if(lev[i]>D)  count++;

       cout<<count<<endl;


    }
}


posted @ 2013-09-18 00:17  814jingqi  阅读(100)  评论(0编辑  收藏  举报