很久很久很久以前没写出来的题,现在突然想起来把它给补了
思路:对于1号节点的若干个儿子节点,我们发现其上有鸟的时间其实就等去该子树的大小-1,然后该树上的鸟到根节点又需要1秒,所以我们只需要找出根节点的若干个儿子中最大的子树就行,用vector存图会超时,所以直接就用链式前向星写了
代码:
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define pb push_back
const int maxn=1e6+9;
int size[maxn];
struct node{
int next,to;
}edge[maxn*2];
int cnt=0;
int head[maxn];
void add(int u,int v){
// cout<<head[u]<<endl;
edge[cnt].next=head[u];
edge[cnt].to=v;
head[u]=cnt++;
}
void dfs(int rt,int pre){
size[rt]=1;
for(int i=head[rt];i!=-1;i=edge[i].next){
int v=edge[i].to;
if(v==pre)continue;
dfs(v,rt);
size[rt]+=size[v];
}
}
int main(){
int i,j,k,n;
scanf("%d",&n);
memset(head,-1,sizeof(head));
int sum=0;
for(i=1;i<n;i++){
int x,y;
scanf("%d%d",&x,&y);
add(x,y);add(y,x);
}
dfs(1,1);
int ans=-1;
for(i=head[1];i!=-1;i=edge[i].next){
int v=edge[i].to;
ans=max(ans,size[v]);
}
printf("%d\n",ans);
}