华为提前批笔试第二批2021-6-30


华为笔试都是三道算法题。以下代码没有A,仅供参考。

一、路线规划

某公司有M个园区,从0到M-1编号,已知2个园区的距离,描述如下:0 1 3,表示从0号园区到1号园区的距离是3(1到0号园区也是3),已知N段距离,未给出距离的则为不可达,现在有一个员工想从A区出发,走遍所有的园区,同一园区只能够经过一次,请计算该员工的最短距离。

输入

第一行:园区个数M,起始园区编号,已知距离个数N
第二行到N行:第一个数字为起始园区,第二个数字为目的园区,第三个数字为距离,中间使用空格区分。
约束:

  1. 0<M<=15,0<N<=45
  2. 所有输入数据>=0,距离输入都为有效范围,不用考虑无效输入。距离范围为:[1,1000]
  3. 每个园区路径不超过3条

输出

最短距离,如无法完成题目条件,则输出-1

样例

4 0 4
0 1 1
1 2 1
2 3 1
1 3 2

输出3
解释:从园区0经过园区1,再从园区1到园区2,最后到达园区3,最短距离3

4 0 4
0 1 1
0 2 1
0 3 1
1 2 1

输出-1
无法从0到3,输出-1

参考代码

使用了DFS解,应该还有更好的解法。leetcode上有类似的题LCP 07. 传递信息
以下代码过了80%的测试用例

import java.util.*;
public class Main {
   
    private static int minDistance = Integer.MAX_VALUE;
    //判断是否能到
    private static boolean flag = false;

    public static void main(String[] args) {
   
        Scanner scanner = new Scanner(System.in);
        int M = scanner.nextInt();
        int start = scanner.nextInt();
        int N = scanner.nextInt();
        //记录两个园区之间的距离
        int[][] distances = new int[M][M];
        for (int i = 0; i < N; i++) {
   
            int x = scanner.nextInt();
            int y = scanner.nextInt();
            int distance = scanner.nextInt();
            //x到y,y到x的距离都是distance
            distances[x][y] = distance;
            distances[y][x] = distance;
        }
        //记录每个园区的访问情况
        boolean[] visited = new boolean[M];
        //开始的园区已访问
        visited[start] = true;
        dfs(start, 0, 1, M, visited, distances);
        if (flag) {
   
            System.out.println(minDistance);
        } else {
   
            System.out.println(-1);
        }
    }

    private static void dfs(int now, int distance, int visited, int m, boolean[] isVisited, int[][] distances) {
   
        if (visited == m) {
   
            flag = true;
            minDistance = Math.min(minDistance, distance);
            return;
        }
        for (int i <
  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值