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\n",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\n",ans[i]);
    return 0;
}
View Code

 

posted on 2019-03-24 17:03  FTA_Macro  阅读(186)  评论(0编辑  收藏  举报

导航