PAT甲级1021 Deepest Root (C++)

本题翻译:
题目给第一行,输入多少对结点,后面就是输入节点1 2,这两个是连在一起的。求最深的节点。
本题思路:
利用深度搜索搜三次,第一次是判断是不是树,第二次判断随机最深的一个节点,第三次就是利用该节点,求另一端最远的节点。
详细代码样例:

#include <bits/stdc++.h>
using namespace std;
int N;
int visited[100001]; 
vector <int> v[100001];
int maxdis = 0;
vector <int> final_point;//记录最大的节点啦 
int max_point = 0;//记录最大的点 
set <int>final_ans;
void dfs(int cur){//需要的信息仅仅只是当前节点 
	if(visited[cur]) return;//如果遍历过了,退出
	visited[cur] = 1;//记录该节点遍历过了
	for(int i:v[cur]){//寻找所有的邻居开始遍历 
		dfs(i); 
	} 
}
void dfs1(int cur,int curlen){
	if(visited[cur]) return;
	visited[cur] = 1; 
	if(curlen>maxdis){
		maxdis = curlen;
		final_point.clear();//如果有大于的 最深节点就要更新咯 
		final_point.emplace_back(cur);
	}
	else if(curlen==maxdis){
		final_point.emplace_back(cur);
	}
		for(int i:v[cur]){
			dfs1(i,curlen+1);
		}
	}

int main(){
	cin>>N;
int	C=N-1;
	while(C--){
		int i,j;
		cin>>i>>j;
		//存好相邻的节点,互为邻居 
		v[i].emplace_back(j);
		v[j].emplace_back(i);
	}//把遍历的visited全部赋值为0 即未遍历 
	int count = 0;//计数
	for(int i=1;i<=N;i++) visited[i]=0;
	for(int i=1;i<=N;i++) {	
	if(!visited[i]){//未遍历过 
		count++;
		dfs(i);//
	}
	}//判断是否为树就成功啦
	if(count>1){
		cout<<"Error: "<<count<<' '<<"components";
	} else{
		//接下来就是找根节点,也就是最远的节点 
		for(int i=1;i<=N;i++) visited[i]=0;//清空标记点
		dfs1(1,0); //找到最远的点咯 
		for(int i=0;i<final_point.size();i++)
		for(int i:final_point) final_ans.insert(i);
		final_point.clear();
		for(int i=1;i<=N;i++) visited[i]=0;//清空标记点
		maxdis=0;
		dfs1(*final_ans.begin(),0);
		for(int i:final_point) final_ans.insert(i);
		for(int i:final_ans) cout<<i<<endl;
	}	
} 

在这里插入图片描述

本题难度还可以,但是有一个点过不去,不知道为啥超时,理论上应该不会超时呀,不能理解。感谢b站的up主弄夫,太厉害啦!
up主的视频指路视频指路
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值