更多JAVA版答案移步我的博客:蓝桥杯JAVA版答案汇总
本题考查
dfs,图(邻接表存储方法)(但实际该题的图退化为树)
思路
首先这个题可以抽象为在一棵树中找到距离最大的两个点。
一个点到其他点的最大距离可能是
不经过根结点
经过根结点
思路可以参考“如何求树内结点距离最大值”。
所以先求出距离根结点最远的点,就能确保这个最大值一定可以包括经过根结的情况(即情况2),然后再进行dfs对情况1情况2进行运算。
- 从根结点开始,找到距离根结点最远的结点p
- 从结点p开始,找到的最大距离就是结果距离
- 根据距离n计算花费,花费cost等于
cost=10*n+Σn
AC代码
使用邻接表方式存储这棵树
import java.util.LinkedList;
import java.util.Scanner;
public class Main {
static class Node{
int index;
int dis;
public Node(int index, int dis) {
this.index=index;
this.dis=dis;
}
}
static LinkedList<Node>[] tree;
static boolean[] flag;
static int maxDis = 0;
static int point=0;
static void dfs(int cityIndex, int dis) {
flag[cityIndex]=true;
if(dis>maxDis) {maxDis=dis; point=cityIndex;}
for(int i=0;i<tree[cityIndex].size();i++) {
Node n=tree[cityIndex].get(i);
if(!flag[n.index])
dfs(n.index, dis+n.dis);
}
}
@SuppressWarnings("unchecked")
public static void main(String[] args) {
Scanner scaner = new Scanner(System.in);
int n = scaner.nextInt();
tree=new LinkedList[n+1];
for(int i=0;i<n+1;i++) tree[i]=new LinkedList<Node>();
flag = new boolean[n+1];
for (int i = 0; i != n-1; i++) {
int temp1 = scaner.nextInt();
int temp2 = scaner.nextInt();
int dis = scaner.nextInt();
tree[temp1].add(new Node(temp2, dis));
tree[temp2].add(new Node(temp1, dis));
}
scaner.close();
dfs(1, 0);
flag = new boolean[n+1];
dfs(point, 0);
int result=10*maxDis;
for(int i=1;i!=maxDis+1;i++) result+=i;
System.out.println(result);
}
}