题意:给定一个图,求以哪些结点为根,能够得到最深的树。
首先任选一个结点进行,层序遍历求最后一层的结点,然后再将最后一层的结点再分别作为根结点,求他们对应的最后一层的结点,对这些所有的“最后一层的结点”去重排序就是答案了。
#include<bits/stdc++.h>
using namespace std;
vector<int>son[10004];
bool vis[10004];
vector<int> level_order(int root){//层序遍历,求最后一层的结点
vector<int>leaf;
queue<int>q;
q.push(root);
while(q.size()){
int len=q.size();
leaf.clear();
while(len--){
int f=q.front();q.pop();
vis[f]=1;
leaf.push_back(f);
for(auto x:son[f]){
if(!vis[x])
q.push(x);
}
}
}
return leaf;
}
int main(){
int n;cin>>n;
for(int i=1;i<n;i++){
int a,b;cin>>a>>b;
son[a].push_back(b);
son[b].push_back(a);
}
int k=0;
for(int i=1;i<=n;i++){
if(!vis[i]){
k++;level_order(i);
}
}
if(k!=1){
printf("Error: %d components",k);
return 0;
}
memset(vis,0,sizeof vis);
vector<int>leaf=level_order(1);//最深的结点
memset(vis,0,sizeof vis);
vector<vector<int>>le;
set<int>st;//去重排序
for(auto x:leaf){//最深的结点为根的最深的结点
st.insert(x);
le.push_back(level_order(x));
}
for(auto x:le){
for(auto y:x)
st.insert(y);
}
for(auto x:leaf)st.insert(x);
for(auto x:st)cout<<x<<endl;
}