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;
}

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

时间: 2024-10-12 09:02:18

1021 Deepest Root [DFS]的相关文章

1021. Deepest Root (25) 并查集&amp;&amp;DFS

1021. Deepest Root (25) 时间限制 1500 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A graph which is connected and acyclic can be considered a tree. The height of the tree depends on the selected root. Now you are supposed to find the root t

PAT 1021. Deepest Root (25)

1021. Deepest Root (25) A graph which is connected and acyclic can be considered a tree. The height of the tree depends on the selected root. Now you are supposed to find the root that results in a highest tree. Such a root is called the deepest root

1021 Deepest Root (25 分)

1021 Deepest Root (25 分) A graph which is connected and acyclic can be considered a tree. The height of the tree depends on the selected root. Now you are supposed to find the root that results in a highest tree. Such a root is called the deepest roo

1021 Deepest Root (25 分)(经典搜索)

1021 Deepest Root (25 分) A graph which is connected and acyclic can be considered a tree. The height of the tree depends on the selected root. Now you are supposed to find the root that results in a highest tree. Such a root is called the deepest roo

PAT 1021 Deepest Root

#include <cstdio> #include <cstdlib> #include <vector> using namespace std; class Node { public: vector<int> adj; bool visited; Node() : visited(false) {} }; void reset_nodes(vector<Node>& nodes) { int len = nodes.size();

1021. Deepest Root

A graph which is connected and acyclic can be considered a tree. The height of the tree depends on the selected root. Now you are supposed to find the root that results in a highest tree. Such a root is called the deepest root. Input Specification: E

1021. Deepest Root (25)

A graph which is connected and acyclic can be considered a tree. The height of the tree depends on the selected root. Now you are supposed to find the root that results in a highest tree. Such a root is called the deepest root. Input Specification: E

PAT 甲级 1021 Deepest Root

https://pintia.cn/problem-sets/994805342720868352/problems/994805482919673856 A graph which is connected and acyclic can be considered a tree. The hight of the tree depends on the selected root. Now you are supposed to find the root that results in a

PAT (Advanced Level) 1021. Deepest Root (25)

先并查集判断连通性,然后暴力每个点作为根节点判即可. #include<iostream> #include<cstring> #include<cmath> #include<algorithm> #include<cstdio> #include<queue> #include<vector> using namespace std; struct Edge { int a,b; }e[20000]; int n,sz