华为笔试都是三道算法题。以下代码没有A,仅供参考。
一、路线规划
某公司有M个园区,从0到M-1编号,已知2个园区的距离,描述如下:0 1 3,表示从0号园区到1号园区的距离是3(1到0号园区也是3),已知N段距离,未给出距离的则为不可达,现在有一个员工想从A区出发,走遍所有的园区,同一园区只能够经过一次,请计算该员工的最短距离。
输入
第一行:园区个数M,起始园区编号,已知距离个数N
第二行到N行:第一个数字为起始园区,第二个数字为目的园区,第三个数字为距离,中间使用空格区分。
约束:
- 0<M<=15,0<N<=45
- 所有输入数据>=0,距离输入都为有效范围,不用考虑无效输入。距离范围为:[1,1000]
- 每个园区路径不超过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 <