牛客题解 | 病毒传播

news/2025/3/10 10:46:29/文章来源:https://www.cnblogs.com/wc529065/p/18762106

题目

题目链接

解题思路

这是一道使用BFS解决的病毒传播问题,主要思路如下:

  1. 问题分析:

    • 给定一个无向图 \(G(V,E)\)
    • 从某个起点 \(v\) 开始传播病毒
    • 每天病毒会传播给相邻节点
    • 给定 \(t\) 天后的感染结果
    • 求所有可能的起始点 \(v\)
  2. 解决方案:

    • 使用BFS模拟病毒传播过程
    • 对每个点作为起点进行验证
    • 记录每个点被感染的时间
    • 比较最终结果与给定结果是否一致
  3. 关键点:

    • 使用邻接表存储图
    • BFS计算传播时间
    • 注意输出格式(空格分隔,无行末空格)

代码

#include <iostream>
#include <vector>
#include <queue>
using namespace std;const int MAXN = 1005;
vector<int> graph[MAXN];  // 邻接表存储图
bool infected[MAXN];      // 最终感染状态
int infTime[MAXN];       // 感染时间
int n, m, k, t;// BFS检查从起点v开始是否能得到给定结果
bool check(int v) {fill(infTime, infTime + n + 1, 0);queue<int> q;q.push(v);infTime[v] = 1;  // 初始时间为1while (!q.empty()) {int curr = q.front();q.pop();if (infTime[curr] > t) break;  // 超过时间t就停止// 遍历相邻节点for (int next : graph[curr]) {if (infTime[next] == 0) {  // 未访问过infTime[next] = infTime[curr] + 1;q.push(next);}}}// 验证结果for (int i = 1; i <= n; i++) {if ((infected[i] && infTime[i] == 0) || (!infected[i] && infTime[i] != 0)) {return false;}}return true;
}int main() {cin >> n >> m;// 建图for (int i = 0; i < m; i++) {int u, v;cin >> u >> v;graph[u].push_back(v);graph[v].push_back(u);}// 读取感染结果cin >> k >> t;for (int i = 0; i < k; i++) {int x;cin >> x;infected[x] = true;}// 检查每个点作为起点vector<int> result;for (int i = 1; i <= n; i++) {if (check(i)) {result.push_back(i);}}// 输出结果if (result.empty()) {cout << "-1" << endl;} else {for (int i = 0; i < result.size(); i++) {if (i > 0) cout << " ";cout << result[i];}cout << endl;}return 0;
}
import java.util.*;public class Main {static final int MAXN = 1005;static ArrayList<Integer>[] graph = new ArrayList[MAXN];static boolean[] infected = new boolean[MAXN];static int[] infTime = new int[MAXN];static int n, m, k, t;// BFS检查从起点v开始是否能得到给定结果static boolean check(int v) {Arrays.fill(infTime, 0);Queue<Integer> q = new LinkedList<>();q.offer(v);infTime[v] = 1;  // 初始时间为1while (!q.isEmpty()) {int curr = q.poll();if (infTime[curr] > t) break;  // 超过时间t就停止// 遍历相邻节点for (int next : graph[curr]) {if (infTime[next] == 0) {  // 未访问过infTime[next] = infTime[curr] + 1;q.offer(next);}}}// 验证结果for (int i = 1; i <= n; i++) {if ((infected[i] && infTime[i] == 0) || (!infected[i] && infTime[i] != 0)) {return false;}}return true;}public static void main(String[] args) {Scanner sc = new Scanner(System.in);n = sc.nextInt();m = sc.nextInt();// 初始化图for (int i = 0; i < MAXN; i++) {graph[i] = new ArrayList<>();}// 建图for (int i = 0; i < m; i++) {int u = sc.nextInt();int v = sc.nextInt();graph[u].add(v);graph[v].add(u);}// 读取感染结果k = sc.nextInt();t = sc.nextInt();for (int i = 0; i < k; i++) {infected[sc.nextInt()] = true;}// 检查每个点作为起点ArrayList<Integer> result = new ArrayList<>();for (int i = 1; i <= n; i++) {if (check(i)) {result.add(i);}}// 输出结果if (result.isEmpty()) {System.out.println("-1");} else {for (int i = 0; i < result.size(); i++) {if (i > 0) System.out.print(" ");System.out.print(result.get(i));}System.out.println();}}
}
from collections import defaultdict, deque
from typing import List, Setdef check(v: int, graph: defaultdict, infected: Set[int], n: int, t: int) -> bool:"""BFS检查从起点v开始是否能得到给定结果"""inf_time = [0] * (n + 1)q = deque([v])inf_time[v] = 1  # 初始时间为1while q:curr = q.popleft()if inf_time[curr] > t:  # 超过时间t就停止break# 遍历相邻节点for next_node in graph[curr]:if inf_time[next_node] == 0:  # 未访问过inf_time[next_node] = inf_time[curr] + 1q.append(next_node)# 验证结果for i in range(1, n + 1):if (i in infected and inf_time[i] == 0) or \(i not in infected and inf_time[i] != 0):return Falsereturn Truedef main():# 读取图的基本信息n, m = map(int, input().split())# 建图graph = defaultdict(list)for _ in range(m):u, v = map(int, input().split())graph[u].append(v)graph[v].append(u)# 读取感染结果k, t = map(int, input().split())infected = set(map(int, input().split()))# 检查每个点作为起点result = []for i in range(1, n + 1):if check(i, graph, infected, n, t):result.append(i)# 输出结果if not result:print("-1")else:print(" ".join(map(str, result)))if __name__ == "__main__":main()

算法及复杂度

  • 算法:BFS(广度优先搜索)
  • 时间复杂度:\(\mathcal{O}(n(n+m))\) - 需要对每个点进行BFS
  • 空间复杂度:\(\mathcal{O}(n+m)\) - 需要存储图和访问数组

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/896717.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Contest3897 - 计科23级算法设计与分析上机作业-01

题目链接 A.判断一个数能否被3,5,7整除 题面思路 直接模拟即可 示例代码 #include<bits/stdc++.h>using namespace std;#define ll long long //#define int ll #define pii pair<int, int> #define all(x) x.begin(),x.end() #define fer(i, m, n) for(int i = m;…

Ollama+DeepSeek+SlackBot

本文介绍了一种使用Slack聊天工具中的机器人SlackBot的API接口,实现本地化部署Ollama的DeepSeek大模型的远程通讯方案。相比于调用公网的API接口,数据隐私稍微好一点点。最终的方案应该是自建加密聊天工具+Ollama本地化部署,但是这个时间成本有点高,用户可以自行尝试。技术…

GreatSQL 8.0.32-27 GA (2025-3-10)

GreatSQL 8.0.32-27 GA (2025-3-10)版本信息发布时间:2025年3月10日版本号:8.0.32-27, Revision aa66a385910下载链接:https://gitee.com/GreatSQL/GreatSQL/releases/tag/GreatSQL-8.0.32-27用户手册:https://greatsql.cn/docs/8.0.32-27/改进提升 在GreatSQL 8.0.32-27版…

牛客题解 | 求整数的阶乘

牛客题库题解题目 题目链接 题解: 题目难度:中等难度 难点: 1.由于数据太大无法通过整数类型表示,因此用字符串存储结果 2.对于每个字符串从尾部开始进行简单的乘法,在其中考虑进位 知识点:大数相乘 思路: 1.构造multiply(int x, int res[], int res_size)函数,数组res…

OP13常见问题

1.直振与切料口的对中 问题:对中不良,导致送料不到位,对光传感器检测不到产品,报警直振缺料。解决方法: 先检查气缸自带的行程调节器有无松动,如果没有松动,通过微调振动盘机构的位置及底脚高度,实现切料口上下左右的对中。2.机器人夹爪气缸磁开线路 1.M8接头长期晃动,…

Android Studio 2022下载与安装

1、安装包 扫描下方二维码关注「软知社」,后台回复【066】三位数字即可免费获取分享链接,无广告拒绝套路; 2、安装教程解压下载安装包,双击Setup.exe安装,弹窗安装对话框点击下一步默认,点击下一步选择安装目录,建议选择C盘之外,点击下一步点击安装安装完成,点击下一…

Adobe Photoshop 2025下载与安装

‌Photoshop 2025的安装环境要求主要包括操作系统、处理器、内存、显卡、显示器分辨率和硬盘空间等方面的具体要求。‌ 操作系统要求‌Windows‌:支持Windows 10(版本21H2)或更高版本,不支持Windows的长期服务版(LTSC)。处理器要求‌Windows‌:支持64位的多核Intel或AMD…

Capture one 2023下载与安装教程

1、安装包 扫描下方二维码关注「软知社」,后台回复【061】三位数字即可免费获取分享链接,无广告拒绝套路; 2、安装教程(建议关闭杀毒软件和系统防护)解压下载安装包,双击软件安装,弹窗安装对话框选择中文,点击确定选择‘我同意。’ 点击下一步选择安装目录,建议C盘之外…

S3FT选择性自监督微调:通过智能选择训练样本提升大模型整体表现

选择性自我监督微调(Selective Self-to-Supervised Fine-Tuning,S3FT)是一种创新的大语言模型微调方法,该方法通过部署专门的语义等价性判断器来识别训练集中模型自身生成的正确响应。在微调过程中,S3FT策略性地结合这些正确响应与剩余样本的标准答案(或其释义版本)来优…

20242935 2024-2025-2 《网络攻防实践》第二周作业

20242935 2024-2025-2 《网络攻防实践》第二周作业 网络信息收集技术 一、实验要求 (1)从www.besti.edu.cn、baidu.com、sina.com.cn中选择一个DNS域名进行查询,获取如下信息:DNS注册人及联系方式 该域名对应IP地址 IP地址注册人及联系方式 IP地址所在国家、城市和具体地理…

Xmanager 8下载与安装教程

1、安装包 扫描下方二维码关注「软知社」,后台回复【059】三位数字即可免费获取分享链接,无广告拒绝套路; 2、安装教程(建议关闭杀毒软件与本地防护设置)双击Xmanager-8.0.0055r.exe安装,弹窗安装对话框点击下一步选择‘我接受。。’,点击下一步选择安装目录D盘,点击下一…

Xftp 8软件下载与安装教程

Xftp 8中文版是一款十分强大、传输快速的FTP文件传输工具,它拥有着十分庞大的用户群体,其凭借着简单的界面、便捷的操作以及强大的功能,深受广大用户的好评与喜爱,当然它也是许许多多专业人士的必备工具之一。 由于Xftp 8是基于MS windows平台的STP和FTP传输工具,所以它不…