精准核酸检测

题目描述

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

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

现在给定一组确诊人员编号 (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 存储接触关系,matrixij = 1 表示 i 和 j 有接触。
  • 由于接触是双向的,我们直接使用该矩阵进行 BFS 遍历即可(当 matrixcurj == 1 时,j 可被 cur 传播)。

3.BFS 搜索

  • 初始化一个布尔数组 visited 标记已访问的人,将确诊病例全部标记并加入队列。
  • 当队列非空时,弹出当前人员 cur,遍历所有可能接触的人 j:若 matrixcurj == 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);
}
相关推荐
樱桃读报僵尸12 分钟前
说说 LLMRouter,Agent 执行过程中怎么动态的选择 LLM
算法
suconnect13 分钟前
Spring Boot接入企业RAG:文档切分、向量检索、权限过滤和答案溯源
java·spring boot·后端
weixin_BYSJ198715 分钟前
springboot校园自习室管理小程序---附源码32142
java·javascript·spring boot·python·django·flask·php
ClickHouseDB1 小时前
ClickHouse托管Postgres:OLTP+OLAP,新能力解锁最佳数据平台
java·前端·数据库
霸道流氓气质1 小时前
Java中集成Smile 技术教程:从入门到工程实践
java·开发语言
wuqingshun3141591 小时前
MyBatis 中#()和$()的区别是什么?
java
小Ti客栈1 小时前
SpringBoot 事件发布机制:原理与应用
java·spring boot·spring
gis开发之家1 小时前
《Vue3 从入门到大神40篇》Vue3 源码详解(十):diff 算法全解析 —— 为什么 Vue3 比 Vue2 更快?
javascript·算法·typescript·前端框架·vue3·vue3源码
进击的丸子1 小时前
虹软人脸服务器SDK-C++语言Demo实操指南
后端·算法
BerrySen1781 小时前
迈向 Next-Gen Java:企业级高并发架构演进与大模型 Agent 落地深度实战
java·开发语言·架构