zoukankan      html  css  js  c++  java
  • 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;
    
    
        }
    }
    


  • 相关阅读:
    嵌套类型返回错误解决办法(如迭代器的设计)
    UITableView的多选删除模式
    UITableView的编辑模式
    指针和引用初理解
    strstr()函数实现
    一句话的单词倒置
    字符串过滤程
    strcpy函数
    二叉排序树(Binary Sort Tree)
    二叉树插入操作
  • 原文地址:https://www.cnblogs.com/814jingqi/p/3339259.html
Copyright © 2011-2022 走看看