树的直径
树的直径的定义:
对于求树的直径,我们有两种方法,使用两次dfs遍历和bfs遍历。
我选用的是dfs遍历,两次dfs遍历。
第一次:任选一个节点,找到最长路的节点去。
第二次:以刚刚走到的那个节点为原点,再跑一遍最长路。
某位Dalao博客中对于其的证明
#include<bits/stdc++.h> using namespace std; int n,x,y; const int maxn=1e6+7; struct node{ int next; int to; }tree[maxn*2]; int head[maxn],cnt; void add(int x,int y){ tree[++cnt].next=head[x]; tree[cnt].to=y; head[x]=cnt; }int dis[maxn];int num; int maxx=0; void dfs(int x){ for(int i=head[x];i;i=tree[i].next){ int v=tree[i].to; if(!dis[v]){ dis[v]=dis[x]+1; dfs(v); } } } int main(){ scanf("%d",&n); for(int i=1;i<n;i++){ scanf("%d%d",&x,&y); add(x,y); add(y,x); } dfs(1); maxx=0;//保存最长路所在节点 for(int i=1;i<=n;i++){ if(dis[i]>dis[maxx]){ maxx=i; } } memset(dis,0,sizeof(dis)); dfs(maxx); for(int i=1;i<=n;i++){ if(dis[i]>dis[maxx]){ maxx=i; } } printf("%d",dis[maxx]); return 0; }