1 solutions

  • 0
    @ 2024-12-24 15:11:35

    算法分析

    从树中的某个点开始搜索,搜索到最远的点一定是某一条直径上的点,同时从搜索到的点再搜索一边,就会得到直径上的另外一个点

    #include<bits/stdc++.h>
    using namespace std;
    const int N=500010,M=N*2,INF=0x3f3f3f3f;
    int n,m;
    int h[N],e[M],ne[M],w[M],idx;
    int fa[N],dist[N];
    bool st[N];
    void add(int a,int b,int c)
    {
        e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
    }
    int dfs(int u,int father) //找到从u开始走到的最远的点
    {
        int res=u;
        //fa[u]=father;
        for(int i=h[u];i!=-1;i=ne[i])
        {
            int j=e[i];
            if(j==father) continue; //如果是父亲节点或者是直径上的点就不用继续了
            dist[j]=dist[u]+w[i];
            int k=dfs(j,u);
            if(dist[k]>dist[res]) 
            {
                res=k;
            }
        }
        return res;
    }
    int main()
    {
        cin>>n;
        memset(h,-1,sizeof h);
        for(int i=0;i<n-1;i++) //获取树
        {
            int a,b,c;
            cin>>a>>b>>c;
            add(a,b,c);
            add(b,a,c);
        }
        int u=dfs(1,-1);
        dist[u]=0;
        int v=dfs(u,-1);
        //cout<<u<<" "<<v<<endl;
        cout<<dist[v];
        return 0;
    }
    
    • 1

    Information

    ID
    2137
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    5
    Tags
    (None)
    # Submissions
    1
    Accepted
    1
    Uploaded By