1021 Deepest Root [DFS]

Posted fta-macro

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1021 Deepest Root [DFS]相关的知识,希望对你有一定的参考价值。

这题一开始没认真看题,直接看样例以为求叶子结点和几棵树。题目的真正的意思是给你一张无环连通图,以任意点为根节点可以把该图看成一棵树,并且如果当前树的深度最大,就称这个点是Deepest Root,也就是题目所要求的(升序输出)。如果这个图有多个连通分量,求连通分量的个数。DFS可以通吃,详见代码~

技术图片
#include <bits/stdc++.h>
#define maxn 100005
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
int n,u,v,p,cnt,maxx,tmax;
vector<int> ve[maxn],ans;
int vis[maxn];
void DFS(int x,int d)
{
    tmax=max(tmax,d);
    for(int i=0;i<ve[x].size();i++)
    {
        if(!vis[ve[x][i]])
        {
            vis[ve[x][i]]=1;
            DFS(ve[x][i],d+1);
        }
    }
}
void dfs(int x)
{
    if(ve[x].size()==0)
        return;
    for(int i=0;i<ve[x].size();i++)
    {
        if(!vis[ve[x][i]])
        {
            vis[ve[x][i]]=1;
            dfs(ve[x][i]);
        }
    }
}
int main()
{
    memset(vis,0,sizeof(vis));
    scanf("%d",&n);
    for(int i=0;i<n-1;i++)
    {
        scanf("%d%d",&u,&v);
        ve[u].push_back(v);
        ve[v].push_back(u);
    }
    cnt=0;
    for(int i=1;i<=n;i++)
    {
        if(!vis[i])
        {
            dfs(i);
            cnt++;
        }
    }
    if(cnt!=1)
    {
        printf("Error: %d components
",cnt);
        return 0;
    }
    maxx=0;
    for(int i=1;i<=n;i++)
    {
        memset(vis,0,sizeof(vis));
        tmax=0;
        vis[i]=1;
        DFS(i,0);
        if(tmax>maxx)
        {
            maxx=tmax;
            ans.clear();
            ans.push_back(i);
        }
        else if(tmax==maxx)
            ans.push_back(i);
    }
    sort(ans.begin(),ans.end());
    for(int i=0;i<ans.size();i++)
        printf("%d
",ans[i]);
    return 0;
}
View Code

 

以上是关于1021 Deepest Root [DFS]的主要内容,如果未能解决你的问题,请参考以下文章

1021 Deepest Root (25 分) 难度: 中 / 知识点: 树的直径 连通块

1021 Deepest Root (25分) 从测试点3超时到满分再到代码优化

1021 Deepest Root (25分) 从测试点3超时到满分再到代码优化

PAT 1021. Deepest Root (25)

PAT 1021 Deepest Root

1021 Deepest Root (25 分)