精准核酸检测

题目描述

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

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

现在给定一组确诊人员编号 (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);
}
相关推荐
金銀銅鐵3 小时前
带您看懂字节码指令(一):一帧里有什么
java·后端·ai编程
专注仿真4 小时前
知识问答模型用到的算法集详解及代码实例
python·算法·代码·大模型训练·控制算法
nice_lcj5205 小时前
【从零理解 Spring AI · 14】RAG 的四个环节:加载、切分、向量化、检索
java·spring boot·embedding·向量数据库·rag·spring ai·ai应用开发
罗西的思考5 小时前
【轻量化复刻大模型 / KIMI K3】AttnRes 模块交互式演示
人工智能·算法·机器学习
学长毕设6 小时前
基于springboot科创竞赛信息平台-附源码
java·spring boot·后端
聪明的笨猪猪7 小时前
Java 工程案例:AI 生成 @Async 异步线程池踩坑
java·经验分享·面试·ai编程
学长毕设7 小时前
基于SpringBoot公务员考试交流平台-附源码
java·spring boot·后端
好悬给我拽开线9 小时前
ZILOT 论文解析
算法
SL_staff10 小时前
私有化低代码:面向强监管行业的可控数字化实践
java·低代码
饮水桶_T10 小时前
JAVA IO流笔记
开发语言·数据结构·算法