AcWing 846. 树的重心

大佬的题解

https://www.acwing.com/solution/content/13513/

题目链接

https://www.acwing.com/problem/content/description/848/

这道题给的标签竟然是
树与图的深度优先遍历
这是神马玩意,然后我点进去看了一下,果然还是没有思路,然后看了y总,如愿以偿,y总yyds,我看懂了,然后我就认真再看了一遍题。
我觉得好像是求子树问题,然后我就有了思路。
AcWing 846. 树的重心

大佬的题解其实讲的很清楚,最主要的是靠自己的想象,最关键的几个变量sum,n。剩下的都是基本的变量,因为我们把根节点堵住了,我们不可能用到根节点的子树,求根节点的子树我们只能用n-1-sum,这个方法,于是这样我们把所有的子树都求出来了。
我脑子可能想出来更简单的方法,很明显,这个时间复杂度是o(n)级别的,非常好,我的是o(n2)级别的,所以还是尽量去学学y总的方法吧。
代码如下,基本和他们的代码大同小异,不过都是各自自己写的,都是根据y总的模板基础上写出来的。

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1e5+10;

int h[N],e[N*2],ne[N*2],idx,n;

void add(int a,int b)
{
    e[idx]=b;ne[idx]=h[a];h[a]=idx++;
}

int ans=N;
bool book[N];

int dfs(int x)
{
    book[x]=true;
    
    int size=0,sum=0;
    
    for(int i=h[x];i!=-1;i=ne[i])
    {
        int j=e[i];
        if(book[j]) continue;
        int t=dfs(j);
        size=max(t,size);
        sum+=t;
    }
    size=max(size,n-1-sum);
    
    ans=min(ans,size);
    
    return sum+1;
}
int main(void)
{
    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;
}

y总代码

https://www.acwing.com/activity/content/code/content/47105/
上一篇:95-846-820-源码-网络-Flink 网络传输优化技术


下一篇:AcWing 846. 树的重心