题解 | #友好城市#

友好城市

https://www.nowcoder.com/practice/d5a28292e62c4419a145ed6ba2656450

import java.util.Scanner;

public class Main {
    private static int n;
    private static int k;
    private static int[][] dist;
    private static int[] cities;
    private static int result = Integer.MAX_VALUE;

    public static void main(String[] args){
        Scanner in = new Scanner(System.in);

        while(in.hasNext()){
            solution(in);
        }
    }

    /**
     * 图: 邻接矩阵
     * @param in
     */
    private static void solution(Scanner in){
        n = in.nextInt();

        dist = new int[n+1][n+1];
        for(int i=1; i<=n; i++){
            for(int j=1; j<=n; j++){
                dist[i][j] = in.nextInt();
            }
        }

        k = in.nextInt();
        cities = new int[2*k];
        for(int i=0; i<2*k; i++){
            cities[i] = in.nextInt();
        }

        floyd();
        dfs(0, 0);

        System.out.println(result);
    }

    /**
     * floyd算法: 多源最短路(多对多)算法
     */
    private static void floyd(){
        for(int k=1; k<=n; k++){
            for(int i=1; i<=n; i++){
                for(int j=1; j<=n; j++){
                    if(i!=j && dist[i][k]!=-1 && dist[k][j]!=-1){
                        if(dist[i][j] == -1){
                            dist[i][j] = dist[i][k] + dist[k][j];
                        }else{
                            dist[i][j] = Math.min(dist[i][j], dist[i][k]+dist[k][j]);
                        }
                    }
                }
            }
        }
    }

    /**
     * 递归遍历
     * @param cnt
     * @param total
     */
    private static void dfs(int cnt, int total){
        if(cnt == 2*k){
            result = Math.min(result, total);
            return;
        }

        for(int i=cnt+1; i<2*k; i++){
            swap(i, cnt+1);
            dfs(cnt+2, total+dist[cities[cnt]][cities[cnt+1]]);
            swap(i, cnt+1);
        }
    }

    /**
     * 交换
     * @param i
     * @param j
     */
    private static void swap(int i, int j){
        int tmp = cities[i];
        cities[i] = cities[j];
        cities[j] = tmp;
    }
}

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务