解体思路
- 寻找到所有的叶子节点,进行dfs,记录深度,最后输出即可。、
- 又犯了zz错误,自罚三杯。
代码
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int n;
struct Node{
int v;
Node(int v_=0):v(v_){}
};
vector<vector<Node>>e;
int num_component=0;
vector<bool>vis;
int dfs(int u){
if(vis[u]){
return 1;
}
vis[u]=true;
for(Node&node:e[u]){
int &v=node.v;
if(!vis[v]){
dfs(v);
}
}
return 0;
}
vector<int>depths;
vector<int>res;
int dfs1(int u){
if(vis[u]){
return 0;
}
vis[u]=true;
int max_depth=1;
for(Node&node:e[u]){
int &v=node.v;
if(!vis[v]){
max_depth=max(max_depth,dfs1(v)+1);
}
}
return max_depth;
}
int main(){
cin>>n;
e.resize(n+1);
vis.resize(n+1);
depths.resize(n+1,1);
int u,v;
Node node;
for(int i=0;i<n-1;i++){
scanf("%d%d",&u,&v);
node.v=v;
e[u].push_back(node);
node.v=u;
e[v].push_back(node);
}
if(n<=0){
cout<<"Error: "<<0<<" components\n";
return 0;
}
for(int i=1;i<=n;i++){
if(dfs(i)==0){
num_component++;
}
}
if(num_component!=1){
cout<<"Error: "<<num_component<<" components\n";
return 0;
}
int max_depth=1;
for(int i=1;i<=n;i++){
fill(vis.begin(),vis.end(),false);
if(e[i].size()==1){
depths[i]=dfs1(i);
max_depth=max(max_depth,depths[i]);
}
}
for(int i=1;i<=n;i++){
if(depths[i]==max_depth){
res.push_back(i);
}
}
sort(res.begin(),res.end());
for(int i=0;i<res.size();i++){
cout<<res[i]<<"\n";
}
return 0;
}