图论:求树的直径

点击查看折叠代码块
/*
两次dfs
第一次定一个根找离他最远的点
然后以该点为根再找离他最远的点
参考:https://www.cnblogs.com/handsome-zyc/p/11237529.html
*/
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5;
const int inf=0x3f3f3f3f;
int n;
struct edge{
    int v,w;
    edge (int a=0,int b=0):v(a),w(b){}
};
vector<edge>G[maxn];
int d[maxn];
int ans=0;
int top_x;

void dfs(int x,int f){
    if(d[x]>ans){
        ans=d[x];
        top_x=x;
    }
    for (int i=0;i<G[x].size();i++){
        int v=G[x][i].v;
        if(v==f) continue;
        int w=G[x][i].w;
        d[v]=d[x]+1;
        dfs(v,x);
    }
}

int main(){
    scanf("%d",&n);
    for (int i=1;i<n;i++){
        int u,v;
        scanf("%d%d",&u,&v);
        G[u].push_back(edge(v,1));
        G[v].push_back(edge(u,1));
    }
    dfs(1,0);
    d[top_x]=0;
    ans=0;
    dfs(top_x,0);
    printf("%d
",ans);
    return 0;
}
你将不再是道具,而是成为人如其名的人
原文地址:https://www.cnblogs.com/wsl-lld/p/13393606.html