1
老大
先以图为例
这题二分,当二分出来一个
#include<bits/stdc++.h>
using namespace std;
const int N=200010,M=2*N;
int n,e[M],ne[M],h[N],idx,dep[N],st,up[N],f[N],mid;
bool vis[N];
void add(int a,int b){
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void dfs(int x,int fa){
dep[x]=dep[fa]+1;
f[x]=fa;
for(int i=h[x];~i;i=ne[i]){
int j=e[i];
if(j==fa)continue;
dfs(j,x);
}
}
void tag(int &x){
dfs(x,0);
for(int i=1;i<=n;++i)
if(dep[i]<=mid)vis[i]=1;
}
bool check(){
memset(vis+1,0,n);
int x=up[mid];
tag(x);
int y=max_element(dep+1,dep+1+n)-dep;
int cnt=mid;
while(cnt&&y!=x)--cnt,y=f[y];
tag(y);
return accumulate(vis+1,vis+1+n,0)==n;
}
int main(){
dep[0]=-1;
memset(h,-1,sizeof h);
scanf("%d",&n);
for(int i=1;i<n;++i){
int a,b;
scanf("%d%d",&a,&b);
add(a,b),add(b,a);
}
dfs(1,0);
st=max_element(dep+1,dep+1+n)-dep;
up[0]=st;
for(int i=1;i<=n;++i){
up[i]=f[up[i-1]];
if(!up[i])up[i]=1;
}
int l=1,r=n;
while(l<r){
mid=l+r>>1;
if(check())r=mid;
else l=mid+1;
}
printf("%d",r);
return 0;
}
本文作者:wscqwq
本文链接:https://www.cnblogs.com/wscqwq/p/17154326.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步