大佬的题解
https://www.acwing.com/solution/content/13513/
题目链接
https://www.acwing.com/problem/content/description/848/
这道题给的标签竟然是
树与图的深度优先遍历
这是神马玩意,然后我点进去看了一下,果然还是没有思路,然后看了y总,如愿以偿,y总yyds,我看懂了,然后我就认真再看了一遍题。
我觉得好像是求子树问题,然后我就有了思路。
大佬的题解其实讲的很清楚,最主要的是靠自己的想象,最关键的几个变量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/