题目描述
为了达到新冠疫情精准防控的需要,为了避免全员核酸检测带来的浪费,需要精准圈定可能被感染的人群。
现在根据传染病流调以及大数据分析,得到了每个人之间在时间、空间上是否存在轨迹的交叉。
现在给定一组确诊人员编号 (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);
}