更多试卷真题,点击:华为OD2023真题试卷列表,刷题必点
计算至少需要多少个快递主站点
时间限制:1s 空间限制:256MB 限定语言:不限
题目描述:
快递业务范围有N个站点,A站点与B站点可以中转快递,则认为A-B站可达,如果A-B可达,B-C可达,则A-C可达。现在给N个站点编号0、1、…n-1,用s[i][j]表示i-j是否可达,s[i][j]=1表示i-j可达,s[i][j]=0表示i-j不可达。
现用二维数组给定N个站点的可达关系,请计算至少选择从几个主站点出发,才能可达所有站点(覆盖所有站点业务)。
说明:s[i][j]与s[j][i]取值相同。
输入描述:
第一行输入为N,N表示站点个数。
之后N行表示站点之间的可达关系,第i行第j个数值表示编号为i和j之间是否可达。输出描述:
输出站点个数,表示至少需要多少个主站点。
补充说明:
1<N<10000
示例1
输入:
4
1 1 1 1
1 1 1 0
1 1 1 0
1 0 0 1
输出:
1
说明:
选择0号站点作为主站点,0站点可达其他所有站点,所以至少选择1个站点作为主站才能覆盖所有站点业务。
示例2
输入:
4
1 1 0 0
1 1 0 0
0 0 1 0
0 0 0 1
输出:
3
说明:
选择0号站点可以覆盖0、1站点,选择2号站点可以覆盖2号站点,选择3号站点可以覆盖3号站点,所以至少选择3个站点作为主站才能覆盖所有站点业务。
JAVA代码满分
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class Main {
public static int[][] square;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
square = new int[num][num];
int row = 0;
int column = 0;
while (row < num) {
column = 0;
while (column < num) {
square[row][column] = scanner.nextInt();
column++;
}
row++;
}
Set<Integer> set = new HashSet<>();
int res = 0;
int i = 0;
while (i < num) {
if (set.contains(i)) {
i++;
continue;
}
Set<Integer> temporary = new HashSet<>();
temporary.add(i);
trace(temporary, i);
set.addAll(temporary);
res++;
i++;
}
System.out.println(res);
}
private static void trace(Set<Integer> temporary, int n) {
int i = 0;
while (i < square.length) {
if (temporary.contains(i)) {
i++;
continue;
}
if (n != i && square[n][i] == 1) {
temporary.add(i);
trace(temporary, i);
}
i++;
}
}
}
JavaScript代码满分
//let num = Number(readline());
let num = Number("4");
var square = [];
var test = [
"1 1 0 0",
"1 1 0 0",
"0 0 1 0",
"0 0 0 1"
];
for(let i=0; i<num; i++){
//square[i] = readline().split(" ").map(Number);
square[i] = test[i].split(" ").map(Number);
}
let set = new Set();
let res = 0;
let i = 0;
while (i < num) {
if (set.has(i)) {
//已经覆盖的站点不需要再判断
i++;
continue;
}
let temporary = new Set();
temporary.add(i);
trace(temporary, i);
set = new Set([...set, ...temporary]);
res++;
i++;
}
console.log(res);
function trace( temporary, n) {
let i = 0;
while (i < square.length) {
if (temporary.has(i)) {
i++;
continue;
}
if (n != i && square[n][i] == 1) {
temporary.add(i);
trace(temporary, i);
}
i++;
}
}
这是一道华为OD2023机试真题,要求计算在给定的快递站点网络中,至少需要选择多少个主站点,以便能够通过中转覆盖所有站点的业务。题目提供了输入输出描述以及两个满分代码实现,分别使用JAVA和JavaScript语言。

被折叠的 条评论
为什么被折叠?



