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

1021 Deepest Root [DFS]

时间:2019-03-24 17:19:27      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:\n   nbsp   mem   节点   cli   ++   col   并且   int   

这题一开始没认真看题,直接看样例以为求叶子结点和几棵树。题目的真正的意思是给你一张无环连通图,以任意点为根节点可以把该图看成一棵树,并且如果当前树的深度最大,就称这个点是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

 

1021 Deepest Root [DFS]

标签:\n   nbsp   mem   节点   cli   ++   col   并且   int   

原文地址:https://www.cnblogs.com/FTA-Macro/p/10588981.html

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