挑战程序设计竞赛(算法和数据结构)——15.4树的直径的JAVA实现

Posted 小乖乖的臭坏坏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了挑战程序设计竞赛(算法和数据结构)——15.4树的直径的JAVA实现相关的知识,希望对你有一定的参考价值。

题目&思路:


代码:

import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Scanner;

public class TreeDiameter 
    static class Edge
        public int t, w;
        Edge()
        Edge(int t, int w)
            this.t = t;
            this.w = w;
        
    

    public static void main(String[] args) 
        Scanner cin = new Scanner(System.in);
        int n = cin.nextInt();
        int d[] = new int[n];//记录各节点与节点0的距离
        ArrayList<Edge> G[] = new ArrayList[n];
        for (int i=0;i<n;i++)//初始化
            G[i] = new ArrayList<>();
//            d[i] = -1;
        
        for (int i=0;i<n-1;i++)
            int s = cin.nextInt();
            int t = cin.nextInt();
            int w = cin.nextInt();
            Edge l1 = new Edge(t, w);
            Edge l2 = new Edge(s, w);
            G[s].add(l1);
            G[t].add(l2);
        

        solve(n, d, G);
    

    public static void solve(int n, int[] d, ArrayList<Edge> G[])
        //从任选的节点s出发,选择距离s最远的节点tgt
        bfs(0, n, d, G);
        int maxv = 0;
        int tgt = 0;
        for (int i=0;i<n;i++)
            if(d[i]==Integer.MAX_VALUE)continue;
            if(maxv<d[i])
                maxv = d[i];
                tgt = i;
            
        

        //从tgt出发,求节点tgt到最远节点的距离maxv
        bfs(tgt, n, d, G);
        maxv = 0;
        for (int i=0;i<n;i++)
            if(d[i]==Integer.MAX_VALUE)continue;
            maxv = Math.max(maxv, d[i]);
        
        System.out.println(maxv);
    

    public static void bfs(int s, int n, int[] d, ArrayList<Edge> G[])
        for (int i=0;i<n;i++)d[i] = Integer.MAX_VALUE;
        ArrayDeque<Integer> Q = new ArrayDeque<>();
        Q.add(s);
        d[s] = 0;
        int u;
        while (!Q.isEmpty())
            u = Q.remove();
            for (int i=0;i<G[u].size();i++)
                Edge e = G[u].get(i);
                if(d[e.t]==Integer.MAX_VALUE)
                    d[e.t] = d[u] + e.w;
                    Q.add(e.t);
                
            
        
    


输入1:

4
0 1 2
1 2 1
1 3 3

输出1:

5

输入2:

4
0 1 1
1 2 2
2 3 4

输出2:

7

以上是关于挑战程序设计竞赛(算法和数据结构)——15.4树的直径的JAVA实现的主要内容,如果未能解决你的问题,请参考以下文章

挑战程序设计竞赛(算法和数据结构)——10.2完全二叉树的JAVA实现

挑战程序设计竞赛(算法和数据结构)——8.4二叉树的遍历的JAVA实现

挑战程序设计竞赛(算法和数据结构)——8.3二叉树的表达的JAVA实现

挑战程序设计竞赛(算法和数据结构)——8.2有根树的表达的JAVA实现

挑战程序设计竞赛(算法和数据结构)——8.5二叉树的重建的JAVA实现

挑战程序设计竞赛(算法和数据结构)——9.2二叉搜索树插入的JAVA实现