【A卷2022Q4】计算至少需要多少个快递主站点(华为od2023机试真题JAVA+JS)

这是一道华为OD2023机试真题,要求计算在给定的快递站点网络中,至少需要选择多少个主站点,以便能够通过中转覆盖所有站点的业务。题目提供了输入输出描述以及两个满分代码实现,分别使用JAVA和JavaScript语言。

更多试卷真题,点击:华为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++;
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值