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

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

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

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

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

k 变异株1 …… 变异株k

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

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

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

输入样例:
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

分析:Edge[i]中保存第i种病毒可能产生的变异病毒编号,in[i]中保存编号i的入度,入度为零的病毒为源头病毒,pa[i]中保存病毒由哪种病毒变异而来(上级病毒)。为了保证序列最小,在输入Edge[i]后可对其进行一次排序~然后通过BFS找到变异次数,过程中由Long和ans标记最多变异次数量以及对应的病毒编号,最后通过pa找回完整变异链~

#include<bits/stdc++.h>
using namespace std;
#define pii pair<int ,int>
int n, k, t, S, Long = 0,  ans, in[10005], pa[10005];
vector<int> F, Edge[10005];
queue<pii> Q;
int main() {cin >> n;for (int i = 0; i < n; i++) {cin >> k;for (int j = 0; j < k; j++) {cin >> t;in[t]++;pa[t] = i;Edge[i].push_back(t);}sort(Edge[i].begin(), Edge[i].end());}for (int i = 0; i < n; i++) if (in[i] == 0) S = i;while(!Q.empty()) Q.pop();Q.push({S, 1});while (!Q.empty()) {int now = Q.front().first, D = Q.front().second;Q.pop();if (D > Long) {Long = D;ans = now;}for (auto nex : Edge[now]) Q.push({nex, D + 1});}cout << Long << '\n';while (ans != S) {F.push_back(ans);ans = pa[ans];}F.push_back(S);for (int i = F.size() - 1; ~i; --i) {cout << F[i];if (i != 0) cout << ' ';}return 0;
}

L2-038 病毒溯源 (25 分)-PAT 团体程序设计天梯赛 GPLT相关推荐

  1. L2-039 清点代码库 (25 分)-PAT 团体程序设计天梯赛 GPLT

    上图转自新浪微博:"阿里代码库有几亿行代码,但其中有很多功能重复的代码,比如单单快排就被重写了几百遍.请设计一个程序,能够将代码库中所有功能重复的代码找出.各位大佬有啥想法,我当时就懵了,然 ...

  2. L2-040 哲哲打游戏 (25 分)-PAT 团体程序设计天梯赛 GPLT

    哲哲是一位硬核游戏玩家.最近一款名叫<达诺达诺>的新游戏刚刚上市,哲哲自然要快速攻略游戏,守护硬核游戏玩家的一切! 为简化模型,我们不妨假设游戏有 N 个剧情点,通过游戏里不同的操作或选择 ...

  3. L2-037 包装机 (25 分)-PAT 团体程序设计天梯赛 GPLT

    一种自动包装机的结构如图 1 所示.首先机器中有 N 条轨道,放置了一些物品.轨道下面有一个筐.当某条轨道的按钮被按下时,活塞向左推动,将轨道尽头的一件物品推落筐中.当 0 号按钮被按下时,机械手将抓 ...

  4. L2-035 完全二叉树的层序遍历 (25 分)-PAT 团体程序设计天梯赛 GPLT

    一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是完美二叉树.对于深度为 D 的,有 N 个结点的二叉树,若其结点对应于相同深度完美二叉树的层序遍历的前 N 个结点,这样的树就是完全二叉树 ...

  5. L2-033 简单计算器 (25 分)-PAT 团体程序设计天梯赛 GPLT

    本题要求你为初学数据结构的小伙伴设计一款简单的利用堆栈执行的计算器.如上图所示,计算器由两个堆栈组成,一个堆栈 S1存放数字,另一个堆栈 S2存放运算符.计算器的最下方有一个等号键,每次按下这个键,计 ...

  6. L2-031 深入虎穴 (25 分)-PAT 团体程序设计天梯赛 GPLT

    著名的王牌间谍 007 需要执行一次任务,获取敌方的机密情报.已知情报藏在一个地下迷宫里,迷宫只有一个入口,里面有很多条通路,每条路通向一扇门.每一扇门背后或者是一个房间,或者又有很多条路,同样是每条 ...

  7. L2-030 冰岛人 (25 分)-PAT 团体程序设计天梯赛 GPLT

    2018年世界杯,冰岛队因1:1平了强大的阿根廷队而一战成名.好事者发现冰岛人的名字后面似乎都有个"松"(son),于是有网友科普如下: 冰岛人沿用的是维京人古老的父系姓制,孩子的 ...

  8. L2-029 特立独行的幸福 (25 分)-PAT 团体程序设计天梯赛 GPLT

    对一个十进制数的各位数字做一次平方和,称作一次迭代.如果一个十进制数能通过若干次迭代得到 1,就称该数为幸福数.1 是一个幸福数.此外,例如 19 经过 1 次迭代得到 82,2 次迭代后得到 68, ...

  9. L2-036 网红点打卡攻略 (25 分)-PAT 团体程序设计天梯赛 GPLT

    一个旅游景点,如果被带火了的话,就被称为"网红点".大家来网红点游玩,俗称"打卡".在各个网红点打卡的快(省)乐(钱)方法称为"攻略".你的 ...

最新文章

  1. 深蓝学院的深度学习理论与实践课程:第四章
  2. 电动车逆变器的基础知识
  3. 2018.3,GC可控了
  4. Python之值得学习练手的22个迷你程序(附代码)
  5. css两列等高,css 多列等高
  6. Ant Design Blazor 发布 0.9.0,共100+人贡献!
  7. 获取应用程序信息.h
  8. matlab cell转数组_MATLAB批量修改文件名
  9. iti axi dsp_ITI的完整形式是什么?
  10. Modifying a Dynamic Library Without Changing the Source Code
  11. Spring整合FreeMarker生成静态页面(静态模板)
  12. 个人身份信息(PII)是什么?会被恶意使用吗?如何保护它?
  13. Databricks中国启示录:一场蓄谋已久的技术与商业战 | 企服国际观察
  14. 怎么样添加桌面我的计算机,怎么样把我的电脑添加到桌面上
  15. DSP28335 ecap使用
  16. python程序员买西瓜代码_朴素贝叶斯python代码实现(西瓜书)
  17. 搜狗输入法,怎么打声调?
  18. [cv]郑哲东 Deep-ReID——Learn pedestrian representations from
  19. 点云配准2:icp算法在PCL1.10.0上的实现+源码解析
  20. 海康硬盘录像机接入RTSP/onvif协议安防视频平台EasyNVR的注意事项

热门文章

  1. C语言实现简单学籍管理系统
  2. 正则表达式去除连续重复的字符
  3. Linux基础管理——磁盘管理及文件系统(全)
  4. 大数据和人工智能将成消费金融主要驱动力
  5. Tabs Outliner(标签系统)
  6. Matlab中的函数句柄@
  7. HBase 管理,性能调优
  8. Hello word ;
  9. 整合ext和dwr 的小例子
  10. WebService的应用之winform身份验证