题目:
思路:
1.题目的意思就是求哪两个城市之间的距离最大,特别要注意的一点是题目中描述的是:任何一个大城市都能从首都直接或者通过其他大城市间接到达,这样就很容易抽象成一个树状结构了,没有两个城市是直接相连的,都是经过首都或者其他城市间接相连的。
2.这样就转化成了求树中权值和最大的通路, 我们可以通过从某个点开始找到离他最远的一个点作为起点,再以该起点去找离该起点最远的某个点,这样就是一条最远的通路了
Code:
import java.util.Scanner;
import java.util.*;
public class Main{
static int[] arr;
static int[] visit;
static int m;
private static int count=0;
static int max=0;
static int a=0;
static List<int[]> []listmap;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n=scanner.nextInt();
listmap=new ArrayList[n+1];
visit=new int[n+1];
visit[1]=1;
for (int i=1;i<=n;i++){
listmap[i]=new ArrayList<>();
}
for (int i=0;i<n-1;i++){
int x=scanner.nextInt();
int y=scanner.nextInt();
int z=scanner.nextInt();
listmap[x].add(new int[]{y,z});
listmap[y].add(new int[]{x,z});
}
// 直观打印邻接表
// for (int i=1;i<=n;i++){
// List<int[]> ints = listmap[i];
// for (int[] arr:ints){
// System.out.print(arr[0]+" "+ arr[1]+" ");
// }
// System.out.println();
// }
dfs(1,0);
// System.out.println(a);
visit=new int[n+1];
max=0;
visit[a]=1;
dfs(a,0);
System.out.println((max+10+11)*max/2);
}
private static void dfs(int point, int dis) {
if (dis>max){
a=point;
max=dis;
}
for (int i = 0; i <listmap[point].size(); i++) {
int y=listmap[point].get(i)[0];
if (visit[y]==1) continue;
visit[y]=1;
dis+=listmap[point].get(i)[1];
dfs(y,dis);
visit[y]=0;
dis-=listmap[point].get(i)[1];
}
}
}