码迷,mamicode.com
首页 > 其他好文 > 详细

PAT-1021. Deepest Root (25)-DFS求树的最大深度

时间:2014-10-06 19:52:50      阅读:257      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   os   ar   for   数据   sp   

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

通过率挺低的,应该是那个大数据的测试用例,内存超出的问题卡住了,最大数据是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\n",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\n",count);
        else
        {
            for(int i=1;i<=n;i++)
            {
                if(height[i]==max_height)
                    printf("%d\n",i);
            }
        }
    }
    return 0;
}

 

PAT-1021. Deepest Root (25)-DFS求树的最大深度

标签:style   blog   color   io   os   ar   for   数据   sp   

原文地址:http://www.cnblogs.com/championlai/p/4008451.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!