首页 > 其他分享 >团体天梯练习 L2-038 病毒溯源

团体天梯练习 L2-038 病毒溯源

时间:2023-04-20 11:47:48浏览次数:38  
标签:fa int 变异 038 L2 天梯 include 节点 病毒

L2-038 病毒溯源

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

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

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

输入格式:

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

随后 \(N\) 行,每行按以下格式描述一种病毒的变异情况: \(k\) 变异株\(1\) …… 变异株\(k\)

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

输出格式:

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

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

注:我们称序列 { \(a_{1}\) , ⋯ , \(a_{n}\) } 比序列 { \(b_{1}\) , ⋯ , \(b_{n}\) } “小”,如果存在 \(1≤k≤n\) 满足 \(a_{i}\) = \(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


解题思路

题目大致意思就是要我们求出一颗上从根节点到叶子节点的最长长度的序列,并且这个序列的字典序尽可能小。所以我们用 \(BFS\) 来解决这个问题,而关键在于字典序最小和答案的还原。

当我们在进行 \(BFS\) 前,只需要保证每个点的孩子节点的顺序是递增的,就可以保证字典序最小了。假设当前出队的点为 \(u\),到达 \(u\) 的距离为 \(d\),其孩子节点为 \(v_{1}, v_{2} ... v_{k}\),很明显到达这些孩子节点的距离为 \(d + 1\),由于孩子节点序列是升序的,第一个入队的节点一定能够保证当前答案序列字典序最小,并且之后的孩子节点 \(v_{2} ... v_{k}\) 不会影响到答案。所以可以在建图的时候,对孩子节点序列进行排序。

一开始,还需要找到树中的根节点 \(root\),只需要定义一个 \(fa\) 数组,\(fa[v]\) 用来表示 \(v\) 的父节点,如果一个节点没有父节点,其 \(fa\) 等于 \(-1\) (初始情况下全部为 \(-1\))。用一个循环找到 \(fa\) 为 \(-1\) 的节点,其就是整棵树的根节点。这个 \(fa\) 还有另一个用处,那就是还原答案,我们可以记录答案序列的最后一个节点编号,然后在得到答案序列时,逆序迭代直到根节点,此时得到的是答案序列的逆序,之后翻转一下或者逆序输出即可。

/*   一切都是命运石之门的选择  El Psy Kongroo  */
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<queue>
#include<deque>
#include<stack>
#include<map>
#include<set>
#include<bitset>
#include<cmath>
#include<functional>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<int, pii> piii;
typedef pair<double, double> pdd;
typedef pair<string, int> psi;
//typedef __int128 int128;
#define PI acos(-1.0)
#define x first
#define y second
//int dx[4] = {1, -1, 0, 0};
//int dy[4] = {0, 0, 1, -1};
const int inf = 0x3f3f3f3f, mod = 1e9 + 7;


const int N = 1e4 + 10;
vector<int> e[N];
int fa[N], root;
int n, res, ed;

void bfs(){
    queue<pii> q;
    q.push({root, 1});

    while(!q.empty()){
        auto [u, d] = q.front();
        q.pop();

        if(d > res){    //只有在大于时更新答案
            res = d;    
            ed = u;     //记录最后一个点
        }

        for(auto &v : e[u]) q.push({v, d + 1});
    }
}

void show(){
    cout << res << endl;
    vector<int> ans;
    int cur = ed;
    while(cur != root){
        ans.push_back(cur);
        cur = fa[cur];
    }
    ans.push_back(root);

    reverse(ans.begin(), ans.end());
    for(int i = 0; i < (int)ans.size() - 1; i ++ ) cout << ans[i] << ' ';
    cout << ans.back() << endl;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);

    cin >> n;
    memset(fa, -1, sizeof(fa));
    for(int u = 0; u < n; u ++ ){
        int k; cin >> k;
        while(k -- ){
            int v; cin >> v;
            e[u].push_back(v);
            fa[v] = u;
        }
        sort(e[u].begin(), e[u].end()); //字典序最小
    }

    while(~fa[root]) root ++ ;

    bfs();

    show();

    return 0;
}

标签:fa,int,变异,038,L2,天梯,include,节点,病毒
From: https://www.cnblogs.com/MAKISE004/p/17336132.html

相关文章

  • GZ038 物联网应用开发赛题第3套 windows 维护
    任务要求:Windows超级管理员账号administrator拥有权限高,容易被有心人用穷举法密码破解,我们可以利用组策略对administrator账号进行改名。默认情况下,Windows有很多端口是开放的,这些开放的端口会带来很大的安全隐患,比如一些流行病毒的后门端口(TCP2745端口等)。我们可以利用IP安......
  • 团体天梯练习 L2-037 包装机
    L2-037包装机一种自动包装机的结构如图1所示。首先机器中有\(N\)条轨道,放置了一些物品。轨道下面有一个筐。当某条轨道的按钮被按下时,活塞向左推动,将轨道尽头的一件物品推落筐中。当\(0\)号按钮被按下时,机械手将抓取筐顶部的一件物品,放到流水线上。图2显示了顺序按下按......
  • GZ038 物联网应用开发赛题第2套 windows维护
    任务要求:利用组策略达到禁止别人改动桌面某些设置的目的,将下面组策略设置界面截屏,在截图中红圈圈出修改项,截图另存为A-14-1.jpg。防止用户更改“我的文档”文件夹的路径。     阻止用户从桌面上添加或删除任务栏。     用户退出时不保存对桌面的更改。 ......
  • GZ038 物联网应用开发赛题第1套 windows 维护
    ------------恢复内容开始------------任务要求:安全审核是Windows最基本的入侵检测方法,当有人尝试对系统进行某种方式入侵的时候(如尝试用户密码,改变帐户策略和未经许可的文件访问等等),都会被安全审核记录下来。利用组策略开启的审核方法如下:审核策略更改:成功,失败。审核......
  • 西南民族大学 2023 天梯自主训练 3
    西南民族大学2023天梯自主训练3正整数A+B#include<bits/stdc++.h>usingnamespacestd;typedefpair<int,int>PII;constintN=1e3+5,INF=0x3f3f3f3f,Mod=1e6;constdoubleeps=1e-8;typedeflonglongll;stringa,b;intx,y;intmain(){ios::sync_with_st......
  • How Many O's? UVA - 11038
    写下区间[a,b]的所有数 ,问一共有多少个0 #include<iostream>#include<cstring>#include<vector>usingnamespacestd;#defineintlonglongintn,f[40][40][2][2];vector<int>a;intdfs(intx,intcnt0,intflg,intlead){ if(x<0){ i......
  • L2-3 智能护理中心统计
    题目描述:智能护理中心系统将辖下的护理点分属若干个大区,例如华东区、华北区等;每个大区又分若干个省来进行管理;省又分市,等等。我们将所有这些有管理或护理功能的单位称为“管理结点”。现在已知每位老人由唯一的一个管理结点负责,每个管理结点属于唯一的上级管理结点管辖。你需要实......
  • 团体天梯练习 L2-030 冰岛人
    L2-030冰岛人2018年世界杯,冰岛队因1:1平了强大的阿根廷队而一战成名。好事者发现冰岛人的名字后面似乎都有个“松”(son),于是有网友科普如下:冰岛人沿用的是维京人古老的父系姓制,孩子的姓等于父亲的名加后缀,如果是儿子就加\(sson\),女儿则加\(sdottir\)。因为冰岛人口较少,为避......
  • 团体天梯练习 L2-028 秀恩爱分得快
    L2-028秀恩爱分得快古人云:秀恩爱,分得快。互联网上每天都有大量人发布大量照片,我们通过分析这些照片,可以分析人与人之间的亲密度。如果一张照片上出现了\(K\)个人,这些人两两间的亲密度就被定义为\(1/K\)。任意两个人如果同时出现在若干张照片里,他们之间的亲密度就是所有这些......
  • 有关SQL2000的配置的优化
    1.对SQL中实例的内存项的设置     可以通过设置SQL中的一个实例的内存分配,来处理SQL对于内存的使用.例如:如果当前SQL服务器为专用SQL数据服务器,可以将内存设为固定方式(分配足够大的内存空间),可以提高数据服务器的执行效率;    2.对SQL中文件组......