zoukankan      html  css  js  c++  java
  • PAT-1021. Deepest Root (25)-DFS求树的最大深度

    这道题目主要是给你一个图,那么计算从任何一点开始,以此为根节点,树的最大深度。不保证图的连通性。

    通过率挺低的,应该是那个大数据的测试用例,内存超出的问题卡住了,最大数据是10^4,如果用邻接矩阵的形式保存图形,那么将是n*n的空间复杂度,就是10^8*4B个数据,为4*10^5KB内存,题目是3.2*10^5KB内存,所以内存超出。卡在内存上了。所以我们想到的是用邻接表来保存图,但是我们实现的时候不用链表,而是用向量数组的形式来保存图,这个方式极好,要常用。

    思路就是用dfs来搜索每一个节点的最大深度。有些人提到用并查集来检查图形的连通性,这样会增加复杂度,本来dfs就可以用来检测图形的连通性,为什么还要用并查集来排除呢,直接上dfs就可以了。

    //
    #include<stdio.h>
    #include<string>
    #include<iostream>
    #include<vector>
    using namespace std;
    #define MAX 10001
    int maxInt=0xffffffff>>1;
    bool visited[MAX];
    int height[MAX];
    int map[MAX][MAX];
    vector<int> adj[MAX];
    int n;
    int dfs(int node)
    {
        bool flag=false;
        int max=-1;
        visited[node]=true;
        vector<int>::iterator it=adj[node].begin();
        for(;it!=adj[node].end();it++)
        {
            int i=*it;
            if(!visited[i])
            {
                flag=true;
                int temp=dfs(i);//subtree max height
                //printf("node %d: %d
    ",i,temp);
                if(max<temp)
                  max=temp;
            }
        }
        if(!flag)
          return 1;
        return max+1;
    }
    
    void init()
    {
        for(int i=1;i<=n;i++)
        {
            visited[i]=false;
        }
    }
    int dfsg()
    {
        int count=0;
        for(int i=1;i<=n;i++)
        {
            if(!visited[i])
            {
                count++;
                height[i]=dfs(i);
            }
        }
        return count;
    }
    
    int main()
    {
        while(cin>>n)
        {
            int a,b;
            visited[n]=false;
            for(int i=1;i<=n;i++)
            {
                adj[i].clear();
            }
            for(int i=1;i<=n-1;i++)
            {
                visited[i]=false;
                cin>>a>>b;
                //map[a][b]=map[b][a]=1;
                adj[a].push_back(b);
                adj[b].push_back(a);
            }
            bool iserr=false;
            int count=1;
            int max_height=-1;
            for(int i=1;i<=n;i++)
            {
                init();
                height[i]=dfs(i);
                if(height[i]>max_height)
                    max_height=height[i];
                for(int j=1;j<=n;j++)
                {
                    if(!visited[j])
                    {
                        count++;
                        dfs(j);
                    }
                }
                if(count>1)
                {
                  iserr=true;
                  break;
                }
            }
            if(iserr)
                printf("Error: %d components
    ",count);
            else
            {
                for(int i=1;i<=n;i++)
                {
                    if(height[i]==max_height)
                        printf("%d
    ",i);
                }
            }
        }
        return 0;
    }
  • 相关阅读:
    禅道admin忘记密码
    redis conf 解析
    MySQL 安装
    Centos7上安装docker (抄)
    Linux查看CPU和内存使用情况 抄
    上传图片到阿里云OSS和获取上传图片的外网url的步骤
    docker mysql
    Oracle 11g,exp导出时空表、少表的解决办法
    使用com.aspose.words将word模板转为PDF乱码解决方案
    oracle数据库,检索出某几个字段不唯一的那些数据
  • 原文地址:https://www.cnblogs.com/championlai/p/4008451.html
Copyright © 2011-2022 走看看