版权声明:转载请标明出处哦 https://blog.csdn.net/PleasantlY1/article/details/82190884
树的直径概念:一颗树上存在的最长路径。
推导过程请参考:https://blog.csdn.net/enjoying_science/article/details/44962389
代码如下(BFS版):
#include<iostream>
#include<stdio.h>
#include<map>
#include<vector>
#include<set>
#include<cstdlib>
#include<string.h>
#include<string>
#include<queue>
#include<algorithm>
#include<cmath>
#define MAXN 5000000
#define LL long long
#define EPS 1e-9
using namespace std;
struct Edge{
int to;
int next;
int w;
}e[MAXN];
int tot,n,max_num,u,v,mst,med;
int dis[MAXN];
bool vis[MAXN];
int head[MAXN];
void init()
{
tot=0;
for(int i=1;i<=n;i++)
{
head[i]=-1;
}
}
void add(int from,int to,int w)
{
e[tot].to=to;
e[tot].w=w;
e[tot].next=head[from];
head[from]=tot++;
}
int maxd;
void bfs(int st)
{
queue<int>q;
int i,now,next;
memset(vis,false,sizeof(vis));
memset(dis,0,sizeof(dis));
vis[st]=true;
q.push(st);
maxd=0;
dis[st]=0;
while(!q.empty())
{
now=q.front();
q.pop();
for(i=head[now];i!=-1;i=e[i].next)
{
int v=e[i].to;
if(!vis[v])
{
vis[v]=true;
dis[v]=e[i].w+dis[now];
if(maxd<dis[v])
{
max_num=v;
maxd=dis[v];
}
q.push(v);
}
}
}
}
int main()
{
while(cin>>n)
{
if(n==1) {
cout<<"0";break;}
init();
for(int i=1;i<=n-1;i++)
{
cin>>u>>v;
add(u,v,1);
add(v,u,1);
}
bfs(1);
mst=max_num;
bfs(mst);
cout<<maxd+1<<endl;
}
return 0;
}
代码如下(DFS(2次)版):