精准核酸检测

题目描述

为了达到新冠疫情精准防控的需要,为了避免全员核酸检测带来的浪费,需要精准圈定可能被感染的人群。

现在根据传染病流调以及大数据分析,得到了每个人之间在时间、空间上是否存在轨迹的交叉。

现在给定一组确诊人员编号 (X1,X2,X3,...Xn)在所有人当中,找出哪些人需要进行核酸检测,输出需要进行核酸检测的数。

(注意:确诊病例自身不需要再做核酸检测)需要进行核酸检测的人,是病毒传播链条上的所有人员,即有可能通过确诊病例所能传播到的所有人。

例如:A是确诊病例,A和B有接触、B和C有接触 C和D有接触,D和E有接触。那么B、C、D、E都是需要进行核酸检测的人

输入描述

第一行为总人数N

第二行为确证病例人员编号(确证病例人员数量<N),用逗号隔开

接下来N行,每一行有N个数字,用逗号隔开,其中第i行的第j个数字表名编号i是否与编号j接触过。0表示没有接触,1表示有接触

备注:

人员编号从0开始

0 < N < 100 0<N<1000<N<100

输出描述

输出需要做核酸检测的人数

用例

输入

复制代码
5
1,2
1,1,0,1,0
1,1,0,0,0
0,0,1,0,1
1,0,0,1,0
0,0,1,0,1

输出

复制代码
3

说明

编号为1、2号的人员为确诊病例

1号与0号有接触,0号与3号有接触,2号与4号有接触。所以,需要做核酸检测的人是0号、3号、4号,总计3人要进行核酸检测。

解题思路

本题要求根据确诊病例及其接触关系,找出所有可能被传播到的人员(即接触链上的所有人),但确诊病例本身不需要检测。

我们可以将人员看作图的节点,接触关系看作无向边(因为接触是相互的),然后从所有确诊病例出发进行广度优先搜索(BFS),遍历所有可达节点,并统计除确诊病例外的节点数量。

步骤详解

1.读取输入

  • 第一行:总人数 N。
  • 第二行:确诊病例编号列表,用逗号分隔。
  • 接下来 N 行:每行 N 个数字(0 或 1),用逗号分隔,表示第 i 行的人与第 j 列的人是否有接触。

2.构建接触图

  • 使用二维数组 matrix 存储接触关系,matrix[i][j] = 1 表示 i 和 j 有接触。
  • 由于接触是双向的,我们直接使用该矩阵进行 BFS 遍历即可(当 matrix[cur][j] == 1 时,j 可被 cur 传播)。

3.BFS 搜索

  • 初始化一个布尔数组 visited 标记已访问的人,将确诊病例全部标记并加入队列。
  • 当队列非空时,弹出当前人员 cur,遍历所有可能接触的人 j:若 matrix[cur][j] == 1 且 j 未被访问,则标记 j 并入队,同时计数器加 1(表示需要核酸检测的新人员)。
  • 注意:确诊病例本身不计入计数器。

4.输出结果

  • 最后输出计数器的值,即为需要做核酸检测的人数。
java 复制代码
public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    int n = Integer.parseInt(scanner.nextLine());
    String[] split = scanner.nextLine().split(",");

    int[] confirmed = new int[split.length];
    for (int i = 0; i < split.length; i++) {
        confirmed[i] = Integer.parseInt(split[i]);
    }

    int[][] matrix = new int[n][n];
    for (int i = 0; i < n; i++) {
        String[] rows = scanner.nextLine().split(",");
        for (int j = 0; j < n; j++) {
            matrix[i][j] = Integer.parseInt(rows[j]);
        }
    }
    scanner.close();

    boolean[] visited = new boolean[n];
    Queue<Integer> queue = new LinkedList<>();
    for (int c : confirmed) {
        queue.offer(c);
        visited[c] = true;
    }

    int count = 0;
    while (!queue.isEmpty()) {
        Integer cur = queue.poll();

        for (int i = 0; i < n; i++) {
            if (matrix[cur][i] == 1 && !visited[i]) {
                visited[i] = true;
                count++;
                queue.offer(i);
            }
        }
    }

    System.out.println(count);
}
相关推荐
许彰午1 小时前
CacheSQL(五):桥接篇
java·数据库·缓存·系统架构
冯诺依曼的锦鲤1 小时前
从零实现高并发内存池:TCMalloc 核心架构拆解
c++·学习·算法·架构
Thomas_Lee_OR2 小时前
多Agent路径规划 LaCAM for multi-agent path finding (MAPF)
算法·路径规划·仓储机器人·mapf
如君愿2 小时前
考研复习 Day28 | 习题--计算机网络第四章(网络层 中)、数据结构(树与二叉树 下)
数据结构·计算机网络·考研·课后习题·记录考研
ATCH IERV2 小时前
Java实战:Spring Boot application.yml配置文件详解
java·网络·spring boot
一切皆是因缘际会2 小时前
可落地数字生命工程:从记忆厮杀到自我意识觉醒全链路,AGI内生智能硅基生命心智建模
人工智能·深度学习·算法·机器学习·ai·系统架构·agi
nlpming2 小时前
opencode Agent 详解
算法
江南十四行2 小时前
排序算法进阶:直接插入排序(简单排序)与希尔排序
数据结构·算法·排序算法
nlpming2 小时前
opencode System Prompt 构建机制 & AGENTS.md注入机制
算法