PAT A1021 Deepest Root

这道题综合了并查集和遍历的相关考点。

对于遍历来说,可以使用DFS和BFS,但是个人觉得BFS更加简单一点,只需要逐层遍历然后记录相应的高度信息就可以,更加简洁,后面会补上DFS的相关做法,目前个人还无法太过清晰了解;

#include<iostream>
#include<stdlib.h>
#include<vector>
#include<stdio.h>
#include<queue>
#include<algorithm>
using namespace std;
using std::vector;
using std::queue;
vector<int> mem[10010];
bool vis[10010]={false};
bool isRoot[10010]={false};
int heigth=0;
vector<int>fin;
int se[10010];
int findfather(int x){
    while(x!=se[x]){
        x=se[x];
    }
    return x;
}
void Union(int u,int v){
    int a=findfather(u);
    int b=findfather(v);
    if(a!=b)
        se[a]=b;
}
void init(){
    for(int i=0;i<10010;i++){
        se[i]=i;
    }
}
int calBlock(int n){
    int Block=0;
    for(int i=1;i<=n;i++){
        isRoot[findfather(i)]=true;
    }
    for(int i=1;i<=n;i++){
        Block+=isRoot[i];
    }
    return Block;
}
int main(){
    queue<int>q;
    int num;
    scanf("%d",&num);
    init();
    for(int i=0;i<num-1;i++){
        int a,b;
        scanf("%d%d",&a,&b);
        mem[a].push_back(b);
        mem[b].push_back(a);
        Union(a,b);
    }
    int Block=calBlock(num);
    if(Block!=1){
        printf("Error: %d components\n",Block);
        system("pause");
        return 0;
    }
    int charge=0;
    for(int i=1;i<=num;i++){
        //使用BFS来广度遍历累计层数
        q.push(i);
        heigth++;
        while(q.size()!=0){
            bool flag=false;//层数是否有效计数
            for(int j=q.size();j>=1;j--){
                //一次性取出一层个元素
                int index=q.front();
                vis[index]=true;
                q.pop();
                if(mem[index].size()!=0){
                    for(int k=0;k<mem[index].size();k++){
                        if(vis[mem[index][k]]==false){
                            q.push(mem[index][k]);
                            flag=true;
                        }
                    }
                }
            }
            if(flag){
                //如果该层有效
                heigth++;
            }
            flag=false;
        }
        if(heigth>charge){
            fin.resize(0);
            fin.push_back(i);
            charge=heigth;
        }else if(heigth==charge){
            fin.push_back(i);
        }
        heigth=0;
        for(int i=0;i<10010;i++)
            vis[i]=false;
    }
    sort(fin.begin(),fin.end());
    for(int i=0;i<fin.size();i++){
        printf("%d\n",fin[i]);
    }
    system("pause");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/InNoVaion_yu/article/details/86742253