0
点赞
收藏
分享

微信扫一扫

蓝桥训练营-大臣的旅费(java)(树中权值和最大的通路)

星巢文化 2022-01-11 阅读 41

题目:

思路:
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];
        }
    }


}
举报

相关推荐

0 条评论