1021. Deepest Root (25)

来源:互联网 发布:windows 文件管理工具 编辑:程序博客网 时间:2024/06/03 16:38

题目:https://www.patest.cn/contests/pat-a-practise/1021

注意:节点数多,采用邻接表保存图的信息,采用DFS遍历图,记录最深节点,再一次从最深节点开始遍历,找到最深的节点

#include<cstdio>#include<set>#include<vector>#include<algorithm>#define MAXN 10010using namespace std;vector<int> G[MAXN];int n,vis[MAXN]={false};int max_H=0,block=0;set<int> temp,A;//遍历图,记录最深高度和对应节点void DFS(int u, int deep){//访问u,判断是否为最大高度vis[u] = true;if(deep > max_H){max_H = deep;temp.clear();temp.insert(u);}else if(deep == max_H){temp.insert(u);}//深度遍历for(int i=0; i<G[u].size(); i++){int v = G[u][i];if(vis[v] == false){//deep+=1;DFS(v,deep+1);}}}void DFS_Trave(){for(int i=1; i<=n; i++){if(vis[i] == false){DFS(i,1);block++;}}}int main(){//输入数据,构造图scanf("%d",&n);for(int i=0; i<n-1; i++){int a,b;scanf("%d%d",&a,&b);G[a].push_back(b);G[b].push_back(a);}//遍历图,记录最深高度和对应节点DFS_Trave();//如果块数大于1if(block > 1){printf("Error: %d components",block);}else{//清空标志位,再遍历一次;fill(vis, vis+MAXN, false);max_H = 0;A = temp; temp.clear();set<int>::iterator it = A.begin();DFS(*it, 1);for(set<int>::iterator it=temp.begin(); it!=temp.end(); it++)A.insert(*it);//输出结果for(set<int>::iterator it=A.begin(); it!=A.end(); it++){printf("%d\n",*it);}}return 0;}


0 0
原创粉丝点击