1 条题解

  • 1
    @ 2024-4-6 10:39:10

    我的第二篇题解 本题目就是,在一个树中,删去一个点,把它分成几个独立的树,而后找到这几个树中结点最多的树,保证这个最多节点的树节点数最少。

    板块: 1.用邻接表输入 2.互相添加,保证输入的树没问题 3.用深度优先搜索进行遍历

    代码如下:

    #include <bits/stdc++.h>
    using namespace std;
    const int N=100010,M=N*2;
    int n,ans=N;
    int h[N],e[M],ne[M],idx;
    bool st[N];
    void add(int a,int b){
    	e[idx]=b; ne[idx]=h[a],h[a]=idx++;
    	}//添加数组
    int dfs(int u){
    	st[u]=true;
    	int sum=1,res=0;
    	for(int i=h[u];i!=-1;i=ne[i]){
    		int j=e[i];
    		if(!st[j]){//判断是否被加过
    			int s=dfs(j);
    			sum+=s; 
    			res=max(res,s);//判断最大值最小
    		}
    	}
    	res=max(res,n-sum);
    	ans=min(ans,res);
    	return sum;
    }//深搜,搜索每个子块中的节点数量
    int main() {
    	cin>>n;
    	memset(h,-1,sizeof h);
    	for(int i=0;i<n-1;i++){
    		int a,b;
    		cin>>a>>b;
    		add(a,b),add(b,a);
    	}//输入部分
    	
    	dfs(1);
    	cout<<ans<<endl;
    	return 0;
    }
    

    代码与苏老师同款的,不要抄,会讲的! 我感觉就是暴力

    信息

    ID
    372
    时间
    1000ms
    内存
    128MiB
    难度
    10
    标签
    递交数
    6
    已通过
    4
    上传者