description:
给出n个点的一颗树 求最长的一条链
solution:
dfs两次 第一个次找到一条直径的另一端 第二次从该点开始跑 找到最远距离即可
code:
#include <bits/stdc++.h> using namespace std; #define LL long long #define ULL unsigned long long #define mes(x, a) memset(x, a, sizeof(x)); #define sca(a) scanf("%d", &a) #define lowbit(x) x&(-x) #define mk make_pair #define pb(x) push_back(x) #define all(x) (x).begin(), (x).end() #define fi first #define se second #define lson v << 1 #define rson v << 1 | 1 #define pii pair<int, int> inline void read(int &x) { x=0; int flag_read=1; char c=getchar(); while(c<'0'||c>'9') { if(c=='-') flag_read=-1; c=getchar(); } while(c>='0'&&c<='9') { x=(x<<3)+(x<<1)+c-'0'; c=getchar(); } x *= flag_read; } void out(int x){ if(x > 9){ out(x / 10); } putchar(x % 10 + '0'); } const int N = 1000005; vector <int> e[N]; int sum,id; void dfs(int x,int fa,int dep){ bool flag = 0; for(int i = 0;i < e[x].size();i ++){ int to = e[x][i]; if(to == fa){ continue; } dfs(to,x,dep + 1); flag = 1; } if(!flag){ if(sum < dep){ sum = dep; id = x; } } } int main(){ int n; scanf("%d",&n); for(int i = 1;i <= n;i ++){ int x,y; scanf("%d%d",&x,&y); e[x].pb(y); e[y].pb(x); } dfs(1,-1,1); dfs(id,-1,1); printf("%d\n",sum); return 0; }