1021. Deepest Root

判断的时候肯定用了并查集,因为这里是树,所以dfs的复杂度不是很高,对每个节点dfs一次找到其最深的深度,在所有节点里都最深的那个节点就是deepest root

#include<algorithm>
#include<vector>
#include<bitset>
#include<iostream>
using namespace std;
const int N=10005;
int root[N],level[N],deep[N],n,checking;
bitset<N>used;
vector<int>adj[N];
void makeset(){
  for(int i=0;i<N;++i)root[i]=i,level[i]=0;
}
int findset(int a){
  if(root[a]!=a) root[a]=findset(root[a]);
  return root[a];
}
void link(int a,int b){
  int x=findset(a),y=findset(b);
  if(x!=y){
    if(level[x]>level[y])root[y]=x;
    else{
      root[x]=y;
      if(level[x]==level[y])++level[y];
    }
  }
}

void dfs(int k,int dep){
  used.set(k);
  if(dep>deep[checking])deep[checking]=dep;
  for(auto&x:adj[k])
    if(!used[x]) dfs(x,dep+1);
}
int main(){
  makeset();
  cin>>n;
  for(int i=1;i<n;++i){
    int a,b;cin>>a>>b;
    adj[a].push_back(b);
    adj[b].push_back(a);
    link(a,b);
  }

  int component=1;
  for(int i=1;i<n;++i)
    for(int j=i+1;j<=n;++j)
      if(findset(i)!=findset(j)){
	++component;link(i,j);}
  if(component!=1){
    printf("Error: %d components\n",component);
  }else{
    for(int i=1;i<=n;++i){
      used.reset();
      checking=i; dfs(i,1);
    }
    int mmax=*max_element(deep+1,deep+n+1);
    for(int i=1;i<=n;++i)
      if(deep[i]==mmax)
	printf("%d\n",i);
  }//else
}



你可能感兴趣的:(1021. Deepest Root)