L2-2 病毒溯源--寻找最长变异链

PTA_2021年总决赛_L2-2 病毒溯源 (25 分)_dfs 阅读详情

V.JPG

病毒容易发生变异。某种病毒可以通过突变产生若干变异的毒株,而这些变异的病毒又可能被诱发突变产生第二代变异,如此继续不断变化。

现给定一些病毒之间的变异关系,要求你找出其中最长的一条变异链。

在此假设给出的变异都是由突变引起的,不考虑复杂的基因重组变异问题 —— 即每一种病毒都是由唯一的一种病毒突变而来,并且不存在循环变异的情况。

输入格式:

输入在第一行中给出一个正整数 N(≤104),即病毒种类的总数。于是我们将所有病毒从 0 到 N−1 进行编号。

随后 N 行,每行按以下格式描述一种病毒的变异情况:

k 变异株1 …… 变异株k

其中 k 是该病毒产生的变异毒株的种类数,后面跟着每种变异株的编号。第 i 行对应编号为 i 的病毒(0≤i<N)。题目保证病毒源头有且仅有一个。

输出格式:

首先输出从源头开始最长变异链的长度。

在第二行中输出从源头开始最长的一条变异链,编号间以 1 个空格分隔,行首尾不得有多余空格。如果最长链不唯一,则输出最小序列。

注:我们称序列 { a1​,⋯,an​ } 比序列 { b1​,⋯,bn​ } “小”,如果存在 1≤k≤n 满足 ai​=bi​ 对所有 i<k 成立,且 ak​<bk​。

输入样例:

10
3 6 4 8
0
0
0
2 5 9
0
1 7
1 2
0
2 3 1

输出样例:

4
0 4 9 1

问题描述

病毒容易发生变异,某种病毒可以通过突变产生若干变异的毒株,这些变异的病毒又可能产生第二代变异,如此不断变化。给定病毒之间的变异关系,要求找出其中最长的一条变异链。如果最长链不唯一,则输出字典序最小的那条。

解题思路

这个问题可以抽象为在有向无环图(DAG)中寻找最长路径,且当有多条最长路径时选择字典序最小的那条。由于题目保证病毒源头唯一且无环,我们可以将其视为一棵树结构。

关键步骤

  1. ​​确定根节点​​:通过计算所有节点的入度,找到唯一没有父节点的根节点
  2. ​​深度优先搜索(DFS)​​:从根节点开始遍历所有可能的变异链
  3. ​​路径比较​​:记录最长路径,当长度相同时选择字典序较小的路径

 

#include<bits/stdc++.h>
using namespace std;

vector<int>v[10005];  // 邻接表存储变异关系:v[父病毒] = {子病毒列表}
vector<int>s;         // 当前DFS路径栈
vector<int>s1;        // 保存的最长变异链
int num=0;            // 用于计算根节点的临时变量
int a;                // 病毒种类数N
int mloong=0;         // 记录最长链长度
int loong=1;          // 当前路径长度

void dfs(int node)
{
    s.push_back(node);          // 当前节点加入路径
    loong = s.size();           // 更新当前路径长度
    
    // 发现更长链,或等长但字典序更小的链时更新
    if(loong > mloong || (loong == mloong && s < s1)) {
        mloong = loong;
        s1 = s;  // vector可直接赋值
    }
    
    // 递归遍历所有子病毒
    for(int child : v[node]) {
        dfs(child);
        s.pop_back();  // 回溯
    }
}

int main() {
    cin>>a;
    // 计算0~N-1的和用于找根节点
    for(int i=0;i<a;i++) num+=i;
    
    // 构建变异树
    for(int i=0;i<a;i++) {
        int k, child;
        cin>>k;
        while(k--) {
            cin>>child;
            v[i].push_back(child);
            num -= child;  // 从总和中减去子节点
        }
    }
    
    dfs(num);  // num现在就是根节点编号
    
    // 输出结果
    cout<<mloong<<endl;
    for(int i=0;i<s1.size();i++) {
        if(i) cout<<" ";  // 非首元素前加空格
        cout<<s1[i];
    }
    return 0;
}

PTA_2021年团体程序设计天梯赛_总决赛_L2-2 病毒溯源 (25 分)_dfs 阅读详情

相关推荐

从零搭建YOLOv2硬件加速器:基于PYNQ-Z2的Vivado HLS与Jupyter Notebook实战

本文详细介绍了如何从零搭建YOLOv2硬件加速器,基于PYNQ-Z2开发板,结合Vivado HLS与Jupyter Notebook实现高效目标检测。通过硬件加速,YOLOv2推理速度提升8倍,功耗降低80%。文章涵盖硬件准备、Vivado HLS工程配置、IP核集成、PYNQ部署及常见问题解决,为开发者提供完整实战指南。

weixin_29188997的博客 1007

L2-2 病毒溯源 (25 分) 详解!

L2-2 病毒溯源 (25 分)       DFS+路径优化存储 题目 代码 #include "bits/stdc++.h" using namespace std; const int G = 10000; vector<int> Map[G]; //用一个二维动态数组来存图 (邻接表) vector<int> res; //用来存放最终答案路径 //判断是否要优化res bool check(vector<int> &v){ if(v.size

DC_Fan的博客 2041

CRMEB小程序订阅消息实战指南:PHP配置与疑难排查

本文提供CRMEB小程序订阅消息的完整实战指南,重点解析PHP环境下的配置流程与常见错误解决方法。文章从订阅消息的核心规则讲起,详细拆解了从微信后台获取模板到CRMEB后台完成字段映射的关键步骤,并提供了从用户授权、缓存清除到服务器日志检查的逐层排查方案,帮助开发者高效打通消息通道,避免常见配置陷阱。

weixin_29022115的博客 316

2021天梯赛L2-038 病毒溯源(DFS)

病毒容易发生变异。某种病毒可以通过突变产生若干变异的毒株,而这些变异的病毒又可能被诱发突变产生第二代变异,如此继续不断变化。 现给定一些病毒之间的变异关系,要求你找出其中最长的一条变异链。 在此假设给出的变异都是由突变引起的,不考虑复杂的基因重组变异问题 —— 即每一种病毒都是由唯一的一种病毒突变而来,并且不存在循环变异的情况。 输入格式: 输入在第一行中给出一个正整数 N(≤10 ​4 ​​ ),即病毒种类的总数。于是我们将所有病毒从 0 到 N−1 进行编号。 随后 N 行,每行按以下格式描述一种病.

qq_43738331的博客 3931

用Python爬取公众号历史所有文章,看这篇就够了

手把手教你爬取公众号历史所有文章

u010522887的专栏 1万+

程序员的自我修养

一个好的程序员的自我修养需要从不同角度出发,工作能力是一个方面,对自身的定位和了解也是一个方面,程序员的工作能力修养包括需求理解、功能设计、沟通确认、代码规范、成果验证、代码重构优化等,通过自我剖析来对自身进行定位并了解自身的优缺点,如去除劣根性、端正意识形态与态度、提升自己的核心竞争力等。 自我剖析 一个成功的人,必须要先了解自己,只有了解自己是什么样的人,了解自身有哪些优缺点,了解自己更合适做什么工作,知道自己做什么才能发挥出自身的优势,这样才能使自己在工作中发光发热,在职业生涯的道路上走的更远。

数通畅联 1674

L2-2 病毒溯源 坑点

在此假设给出的变异都是由突变引起的,不考虑复杂的基因重组变异问题 —— 即每一种病毒都是由唯一的一种病毒突变而来,并且不存在循环变异的情况。某种病毒可以通过突变产生若干变异的毒株,而这些变异的病毒又可能被诱发突变产生第二代变异,如此继续不断变化。输入在第一行中给出一个正整数 N(≤10^4),即病毒种类的总数。于是我们将所有病毒从 0 到 N−1 进行编号。现给定一些病毒之间的变异关系,要求你找出其中最长的一条变异链。如果不不注意这两点,这题其实就是一个简单的dfs。

qq_74276498的博客 396

风控IV、AUC、KS python计算代码

df_temp:数据集,Y:是否逾期标签,feas_list:需要计算IV的 变量。2、 按月和不同Y 下的 IV计算。

暮雨听轩的专栏 1617

L2-2病毒溯源(关于内存超限这件事

病毒溯源(一些之前写的没发出来的题)

不依法度的博客 301

IMU660RA姿态解算实战:从传感器滤波到欧拉角输出的完整实现

本文详细介绍了IMU660RA姿态解算的完整实现过程,从传感器滤波到欧拉角输出。通过实战案例和代码示例,展示了如何有效处理陀螺仪和加速度计的噪声问题,并选择合适的算法进行数据融合和姿态解算。特别强调了欧拉角输出中的坐标系对齐和动态补偿技巧,帮助工程师快速掌握IMU660RA的应用。

weixin_42524762的博客 386

华为OD机考双机位C卷 - 敌情监控 (Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 敌情监控 (OD上机考试双机位C卷)。提供在线OJ刷题。Java、C++、Python、GO语言、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 964

2021年团体程序设计天梯赛题解

太菜了,拖后腿的感觉是真的难受。然后,你们可以三连一下文章,安慰一下吗? 知道用回溯来求解,但是不知道怎么模拟。就拿了1分,真的难。 L2-2 病毒溯源 (25 分) 病毒容易发生变异。某种病毒可以通过突变产生若干变异的毒株,而这些变异的病毒又可能被诱发突变产生第二代变异,如此继续不断变化。 现给定一些病毒之间的变异关系,要求你找出其中最长的一条变异链。 在此假设给出的变异都是由突变引起的,不考虑复杂的基因重组变异问题 —— 即每一种病毒都是由唯一的一种病毒突变而来,并且不存在循环变异的情况。 .

DJ同学 1048

手游功耗优化:从猜想到硬核实测

功耗本质是“硬件在吃电”,要看电流/功率曲线,而不是只看帧率和温度;定量 = 有数字、有曲线、有对比能说“降了 15%”、“峰值从 7W 降到 5.5W”,而不是“我感觉凉快点”;工具方面:大厂会用外接功率仪 + 手机/芯片厂内部平台;平时也会用 Android/iOS/引擎自带的工具做趋势分析;流程上:选典型机型和场景 → 跑脚本采集 → 对齐 Profiler 数据 → 分析 CPU/GPU/网络谁在吃电;再通过版本对比、画质/帧率组合测试,指导配置和优化。这是一个。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 174

天梯赛L2-16 38 47 DFS

大家都知道五服以内不得通婚,即两个人最近的共同祖先如果在五代以内(即本人、父母、祖父母、曾祖父母、高祖父母)则不可通婚。本题就请你帮助一对有情人判断一下,他们究竟是否可以成婚?注意:题目保证两个人是同辈,每人只有一个性别,并且血缘关系网中没有乱伦或隔辈成婚的情况。对每一对有情人,判断他们的关系是否可以通婚:如果两人是同性,输出。如果某人的父亲或母亲已经不可考,则相应的。如果是异性并且关系出了五服,输出。如果异性关系未出五服,输出。是5位数字,每人不同;输入第一行给出一个正整数。行,每行给出一对有情人的。

m0_74403143的博客 290

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

PTA L2-038 病毒溯源

附测试点解析。

写代码的七柒的博客 1705

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

L2-038 病毒溯源 - java

L2-2 病毒溯源 (25 分)

谢谢 啊sir的博客 1374

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

L2-2 病毒溯源 (25 分)(Dfs详细解析)

病毒容易发生变异。某种病毒可以通过突变产生若干变异的毒株,而这些变异的病毒又可能被诱发突变产生第二代变异,如此继续不断变化。 现给定一些病毒之间的变异关系,要求你找出其中最长的一条变异链。 在此假设给出的变异都是由突变引起的,不考虑复杂的基因重组变异问题 —— 即每一种病毒都是由唯一的一种病毒突变而来,并且不存在循环变异的情况。 输入格式: 输入在第一行中给出一个正整数 N(≤10 ​4 ​​ ),即病毒种类的总数。于是我们将所有病毒从 0 到 N−1 进行编号。 随后 N 行,每行按以下格式描述一种病毒.

weixin_45962741的博客 6320

L2-038 病毒溯源

L2-038 病毒溯源 现给定一些病毒之间的变异关系,要求你找出其中最长的一条变异链。 在此假设给出的变异都是由突变引起的,不考虑复杂的基因重组变异问题 —— 即每一种病毒都是由唯一的一种病毒突变而来,并且不存在循环变异的情况。 输入格式: 输入在第一行中给出一个正整数 N(≤104),即病毒种类的总数。于是我们将所有病毒从 0 到 N−1 进行编号。 随后 N 行,每行按以下格式描述一种病毒的变异情况: k 变异株1 …… 变异株k 其中 k 是该病毒产生的变异毒株的种类数,后面跟着每种变异株的编号。第

F_Just 698

PTA天梯赛L2-038 病毒溯源

原题传送门 题目 病毒容易发生变异。某种病毒可以通过突变产生若干变异的毒株,而这些变异的病毒又可能被诱发突变产生第二代变异,如此继续不断变化。 现给定一些病毒之间的变异关系,要求你找出其中最长的一条变异链。 在此假设给出的变异都是由突变引起的,不考虑复杂的基因重组变异问题 —— 即每一种病毒都是由唯一的一种病毒突变而来,并且不存在循环变异的情况。 输入格式 输入在第一行中给出一个正整数 N(≤10^​4​​ ),即病毒种类的总数。于是我们将所有病毒从 0 到 N−1 进行编号。 随后 N 行,每行按以下格式

suolk的博客 3060

L2-2 病毒溯源 (25 分)

某次天梯训练

m0_53089923的博客 1075

【AcWing】蓝桥杯集训每日一题Day23|树形DP|字典序最小3465.病毒溯源(C++)

在此假设给出的变异都是由突变引起的,不考虑复杂的基因重组变异问题 —— 即每一种病毒都是由唯一的一种病毒突变而来,并且不存在循环变异的情况。是该病毒产生的变异毒株的种类数,后面跟着每种变异株的编号。某种病毒可以通过突变产生若干变异的毒株,而这些变异的病毒又可能被诱发突变产生第二代变异,如此继续不断变化。保证了变异的方式是一颗树,不会发生交叉变异和循环变异,一定是从父节点向子节点变异。一开始是一个病毒,有可能会变异成多个不同的病毒,变异的病毒还可能变异成新的病毒。如果有多个方案的话,输出字典序最小的方案。

ChoSeitaku的博客 945

L2-038 病毒溯源 (25 分)

病毒容易发生变异。某种病毒可以通过突变产生若干变异的毒株,而这些变异的病毒又可能被诱发突变产生第二代变异,如此继续不断变化。 现给定一些病毒之间的变异关系,要求你找出其中最长的一条变异链。 在此假设给出的变异都是由突变引起的,不考虑复杂的基因重组变异问题 —— 即每一种病毒都是由唯一的一种病毒突变而来,并且不存在循环变异的情况。 输入格式: 输入在第一行中给出一个正整数 N(≤10 4 ),即病毒种类的总数。于是我们将所有病毒从 0 到 N−1 进行编号。 随后 N 行,每行按以下格式描述一种病毒的变异情.

weixin_45962741的博客 2150

L2-038 病毒溯源 (详细解析)

病毒容易发生变异。某种病毒可以通过突变产生若干变异的毒株,而这些变异的病毒又可能被诱发突变产生第二代变异,如此继续不断变化。 现给定一些病毒之间的变异关系,要求你找出其中最长的一条变异链。 在此假设给出的变异都是由突变引起的,不考虑复杂的基因重组变异问题 —— 即每一种病毒都是由唯一的一种病毒突变而来,并且不存在循环变异的情况。 输入格式: 输入在第一行中给出一个正整数N(≤104),即病毒种类的总数。于是我们将所有病毒从 0 到N−1进行编号。 随后N行,每行按以下格式描述一种病毒...

daybreak_alonely的博客 1209

天梯赛L2-38 病毒溯源 (25 分)

病毒容易发生变异。某种病毒可以通过突变产生若干变异的毒株,而这些变异的病毒又可能被诱发突变产生第二代变异,如此继续不断变化。 现给定一些病毒之间的变异关系,要求你找出其中最长的一条变异链。 在此假设给出的变异都是由突变引起的,不考虑复杂的基因重组变异问题 —— 即每一种病毒都是由唯一的一种病毒突变而来,并且不存在循环变异的情况。 输入格式: 输入在第一行中给出一个正整数N(≤10​4​​),即病毒种类的总数。于是我们将所有病毒从 0 到N−1进行编号。 随后N行,每行按以下格式描述一...

m0_51385035的博客 1427
上一篇: 联通块的权:求解网格矩阵中联通块的最大权值
下一篇: L2-3 清点代码库
loopdeloop
博客等级 码龄4年 219粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值