1 条题解

  • 0
    @ 2023-10-18 9:56:21

    C++ :

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e5+10,M=2*N;
    int h[N],e[M],ne[M],idx;
    int ans=N; //答案 
    int n;
    void add(int a,int b)
    {
        e[idx]=b,ne[idx]=h[a],h[a]=idx++;
    }
    int dfs(int u,int f)
    {
        int s=1; //以u为根的节点数 
        int cnt=0;//将u删除以后,连通块中节点数的最大值 
        for(int i=h[u];i!=-1;i=ne[i])
        {
            int j=e[i]; 
            if(j==f) continue;
            int c=dfs(j,u); //计算儿子节点的数目 
            s+=c; //累加 
            cnt=max(cnt,c); //更新最大值 
        }
        cnt=max(n-s,cnt); //上面和子树取最大值 
        ans=min(ans,cnt); //所有节点求最小值 
        return s;
    }
    int main()
    {
        memset(h,-1,sizeof h);
        cin>>n;
        for(int i=1;i<n;i++)
        {
            int a,b;
            cin>>a>>b;
            add(a,b);
            add(b,a);
        }
        dfs(1,-1);
        cout<<ans;
        return 0;
    }
    
    • 1

    信息

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