1 条题解

  • 0
    @ 2023-10-18 9:56:21

    C++ :

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e5+10,M=2e5+10,INF=0x3f3f3f3f;
    int h[N],e[M],ne[M],w[M],idx;
    int d1[N],d2[N],p[N],leaf[N],up[N];
    //d1[u] 表示u往下走的最远距离 d2[u] 表示往下走的最远距离
    //p[u]=j 表示u往下走的最远距离经过j leaf[u]=1 表示u是叶子节点 up[u]表示u往上走的最远距离 
    void add(int a,int b,int c)
    {
        e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;
    }
    int dfs(int u,int father)
    {
        d1[u]=d2[u]=-INF;
        for(int i=h[u];i!=-1;i=ne[i])
        {
            int j=e[i];
            if(j==father) continue;
            int d=dfs(j,u)+w[i];
            if(d>d1[u]) 
    		{
                d2[u]=d1[u],d1[u]=d; //更新u的最大值和次大值 
                p[u]=j; //更新u经过的节点 
            }else if(d>d2[u])
            {
                d2[u]=d; //更新次大值 
            }
        }
        if(d1[u]==-INF) //没有更新过最大值,也就是叶子节点 
        {
            leaf[u]=1;
            d1[u]=d2[u]=0;
        }else if(d2[u]==-INF)
        {
        	d2[u]=0;
    	}
        return d1[u]; //返回最大距离 
    }
    void dfs2(int u,int father)
    {
        for(int i=h[u];i!=-1;i=ne[i])
        {
            int j=e[i];
            if(j==father) continue;
            if(p[u]==j) //u的最长路径经过了j,那么j往上走的时候只有由u的往上走的距离和次大距离更新 
    		{
    			up[j]=max(d2[u],up[u])+w[i];  
    		} 
            else up[j]=max(d1[u],up[u])+w[i]; //j往上走的时候只由u的往上走的距离和最大距离更新 
            dfs2(j,u); //j再继续去更新 
        }
    }
    int main()
    {
        int n;
        cin>>n;
        memset(h,-1,sizeof h);
        for(int i=1;i<n;i++)
        {
            int a,b,c;
            cin>>a>>b>>c;
            add(a,b,c);
            add(b,a,c);
        }
        dfs(1,-1);
        dfs2(1,-1);
        int ans=INF;
        for(int i=1;i<=n;i++)
        {
            if(leaf[i]) ans=min(ans,up[i]); //叶子节点只能往上 
            else ans=min(ans,max(d1[i],up[i])); //由往下和网上的最大值决定 
        }
        cout<<ans;
        return 0;
    }
    
    • 1

    信息

    ID
    766
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者