1 条题解

  • 0
    @ 2025-10-10 20:11:58

    C++ :

    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 100010;
    //si:每个结点对应子树的大小
    int pre[N],k,si[N]; 
    int fa[N];//每个结点的父元素 
    struct node{
    	int from,to,next;
    }a[N*2];
    bool f[N]; 
    int n,ans = INT_MAX;
    
    //求每个结点所对应子树大小 
    int dfs(int x){
    	si[x] = 1;
    	f[x] = true;//走过标记
    	
    	//x能去的点
    	for(int i = pre[x];i != 0;i = a[i].next){
    		//没走过 
    		if(!f[a[i].to]){
    			fa[a[i].to] = x;//标记父元素 
    			si[x] += dfs(a[i].to);//子树的大小 
    		}
    	} 
    	
    	return si[x]; 
    } 
    
    void add(int u,int v){
    	k++;
    	a[k].from = u;
    	a[k].to = v;
    	a[k].next = pre[u];
    	pre[u] = k;
    }
    
    //检验每个点是否是重心 
    bool check(int x){
    	if(n-si[x]>n/2) return 0;
    	//当前点能去的点,也就是当前点的子树 
    	for(int i = pre[x];i != 0;i = a[i].next){
    		//如果该点是合法的点 
    		if(fa[a[i].to]==x && (si[a[i].to] > n / 2)){
    			return 0;
    		}  
    	} 
    	
    	return 1;
    }
    
    int main(){
    	cin>>n;
    	int x,y;
    	for(int i = 1;i <= n - 1;i++){
    		cin>>x>>y;
    		add(x,y);
    		add(y,x);
    	}
    	
    	//求每个结点的子结点的数量 
    	dfs(1);
    	
    	//输出重心
    	for(int i = 1;i <= n;i++){
    		if(check(i)) cout<<i<<" ";
    	} 
    }
    
    
    • 1

    信息

    ID
    1075
    时间
    1000ms
    内存
    512MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者