1 条题解

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

    C++ :

    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 100010;
    int pre[N],k;
    struct node{
    	int from,to,next;
    }a[N*2];
    bool f[N]; 
    int n,ans = INT_MAX;
    
    //求每个结点所对应子树大小 
    int dfs(int x){
    	f[x] = true;//走过标记
    	int sum = 1;//存储该子树的大小 
    	int res = 0;//最大的子树的大小 
    	
    	//x能去的点
    	for(int i = pre[x];i != 0;i = a[i].next){
    		//没走过 
    		if(!f[a[i].to]){
    			int s = dfs(a[i].to);//子树的大小 
    			res = max(res,s);
    			sum += s; 
    		}
    	} 
    	
    	//除了当前子树以外,另外一棵子树大小 
    	res = max(res,n - sum);
    	ans = min(res,ans);//最大子树的最小值
    	return sum; 
    } 
    
    void add(int u,int v){
    	k++;
    	a[k].from = u;
    	a[k].to = v;
    	a[k].next = pre[u];
    	pre[u] = k;
    }
    
    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);
    	
    	cout<<ans; 
    }
    
    
    • 1

    信息

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