1021 Deepest Root (层序遍历解法)

题意:给定一个图,求以哪些结点为根,能够得到最深的树。

首先任选一个结点进行,层序遍历求最后一层的结点,然后再将最后一层的结点再分别作为根结点,求他们对应的最后一层的结点,对这些所有的“最后一层的结点”去重排序就是答案了。

#include
using namespace std;
vectorson[10004];
bool vis[10004];
vector level_order(int root){//层序遍历,求最后一层的结点
    vectorleaf;
    queueq;
    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>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);
    vectorleaf=level_order(1);//最深的结点
    memset(vis,0,sizeof vis);
    vector>le;
    setst;//去重排序
    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<

你可能感兴趣的:(pat,算法,数据结构)