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;
}