tyvj4865 天天和树tree

时间:2023-03-09 08:37:33
tyvj4865 天天和树tree
#include<bits/stdc++.h>
#define MAXN 100000+10
using namespace std;
struct ed{int v,next;}edge[*MAXN];
int n,far1,far2,maxlen,ans=,head[MAXN],pre[MAXN],d[MAXN];
bool is[MAXN],vis[MAXN];
void add(int u,int v){
static int tot=;
edge[++tot].v=v;
edge[tot].next=head[u];
head[u]=tot;
}
void dfs1(int u,int fa,int len){
if(len>maxlen){maxlen=len;far1=u;}
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].v;
if(v!=fa)dfs1(v,u,len+);
}
}
void dfs2(int u,int fa,int len){
pre[u]=fa;
if(len>maxlen){maxlen=len;far2=u;}
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].v;
if(v!=fa)dfs2(v,u,len+);
}
}
void dfs3(int u,int fa,int dis){
d[u]=dis;
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].v;
if(v!=fa)dfs3(v,u,dis+);
}
}
int main(){
scanf("%d",&n);
for(int i=;i<n;i++){
int u,v;
scanf("%d%d",&u,&v);
add(u,v);add(v,u);
}
maxlen=;
dfs1(,,);
maxlen=;
dfs2(far1,far1,);
is[far1]=;
for(int i=far2;i!=pre[i];i=pre[i])is[i]=;
for(int u=;u<=n;u++)
if(is[u]){
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].v;
if(!is[v])dfs3(v,u,);
}
}
for(int i=;i<=n;i++)
if(!is[i])ans=max(ans,d[i]);
printf("%d",ans);
return ;
}

找直径即可,正确性显然(嘿嘿嘿。。。)

其实反证法很容易搞定。。。。