您的位置:首页 > 其它

TYVJ 4865 天天和树tree || 清北学堂金秋杯大奖赛

2017-09-20 17:16 316 查看

题目描述:



#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define MAXN 110000
inline void read(int &x){
x=0; int f=1; char c=getchar();
while(c>'9'||c<'0'){ if(c=='-') f=-1; c=getchar(); }
while(c>='0'&&c<='9'){ x=x*10+c-'0'; c=getchar(); } x*=f;
}
struct Edge{ int to,next; }e[MAXN<<1];
int head[MAXN],fa[MAXN],dep[MAXN],pos,Max,num,n,tot;
bool vis[MAXN];

void dfs1(int u){
for(int i=head[u];i;i=e[i].next){
int v=e[i].to;
if(fa[u]==v) continue;
dep[v]=dep[u]+1,fa[v]=u;
if(dep[v]>Max) Max=dep[v],pos=v;
dfs1(v);
}
}

inline void Add_Edge(int u,int v){
e[++tot].to=v,e[tot].next=head[u],head[u]=tot;
}

bool dfs2(int u){
if(u==pos){ vis[u]=true;dep[u]=0;return vis[u]; }
bool flag=false;
for(int i=head[u];i;i=e[i].next){
int v=e[i].to;
if(v==fa[u]) continue;
fa[v]=u;
if(dfs2(v)==true) flag=true;
}
if(flag) dep[u]=0,vis[u]=true;
return flag;
}

void dfs3(int u){
for(int i=head[u];i;i=e[i].next){
int v=e[i].to;
if(v==fa[u]) continue;
fa[v]=u;
if(vis[v]) dep[v]=0;
else dep[v]=dep[u]+1;
Max=max(Max,dep[v]);dfs3(v);
}
}

int main(){
read(n);
for(int u,v,i=1;i<n;++i){
read(u),read(v);
Add_Edge(u,v),Add_Edge(v,u);
}
dep[1]=1,fa[1]=0,Max=-1;
dfs1(1);
memset(dep,0,sizeof dep );memset(fa,0,sizeof fa );
int pp=pos;
dfs1(pp);
bool tmp=dfs2(pp);
memset(fa,0,sizeof fa );
Max=-1;
dfs3(pos);
printf("%d",Max);
return 0;
}


路径就是树的直径
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  搜索