挑战程序设计竞赛(算法和数据结构)——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实现