首页 > 编程语言 >L2-2 病毒溯源-Java

L2-2 病毒溯源-Java

时间:2023-04-21 12:55:06浏览次数:53  
标签:Java get 变异 int L2 result new 病毒 溯源

题目

L2-2 病毒溯源

V.JPG

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

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

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

输入格式:

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

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

k 变异株1 …… 变异株k

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

输出格式:

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

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

注:我们称序列 { a1,⋯,a**n } 比序列 { b1,⋯,b**n } “小”,如果存在 1≤kn 满足 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

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

题解

在这里插入图片描述

思路:

  • 用邻接表来存储变异关系
  • 需要注意的是,由于题目中要找的是最小编号的数组,所以在每次插入孩子节点的时候,需要排一个序,将大孩子放右边,小孩子放左边,这样只需要第一次找到最深的就是最短的路径

代码实现:

import java.io.*;
import java.util.*;

public class Main {
    static StreamTokenizer sc = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));

    //快写
    static PrintWriter out = new PrintWriter(System.out);

    //快读
    static int ini() throws IOException {
        sc.nextToken();
        return (int) sc.nval;
    }

    static LinkedList<Integer> result = new LinkedList<>();     //最终的结果
    static ArrayList<LinkedList<Integer>> edges = new ArrayList<>();    //邻接表来存储变异关系
    static LinkedList<Integer> temp = new LinkedList<>();   //临时存储(过程存储)

    public static void main(String[] args) throws IOException {
        int n = ini();
        boolean[] visited = new boolean[n];
        for (int i = 0; i < n; i++) {
            edges.add(new LinkedList<>());  //创建邻接表
        }

        for (int i = 0; i < n; i++) {
            int k = ini();
            for (int j = 0; j < k; j++) {
                int thisNum = ini();
                visited[thisNum] = true;    //对出现过的节点做标记,表明它不是根节点
                edges.get(i).add(thisNum);
            }
            Collections.sort(edges.get(i));     //每次放完孩子都需要排序,以求得最小的编号
//            System.out.println(edges.get(i));
        }

        for (int i = 0; i < n; i++) {
            if (visited[i] == false) {  //找到根节点
                temp.add(i);
                bfs(i); //从根节点开始搜索
                break;
            }
        }

        out.println(result.size());

        for (int i = 0; i < result.size(); i++) {
            if (i == 0) {
                out.print(result.get(i));
            } else {
                out.print(" " + result.get(i));
            }
        }
        out.flush();
        out.close();
    }

    private static void bfs(int index) {
        if (temp.size() > result.size()) {  //如果temp的长度>result的长度,则更新result
            result = new LinkedList<>(temp);
        }

        for (int i = 0; i < edges.get(index).size(); i++) {     //标号为index的孩子节点
            temp.add(edges.get(index).get(i));  //先将孩子节点入temp
            bfs(edges.get(index).get(i));   //对孩子节点进行深度搜索
            temp.removeLast();  //回溯回溯回溯!
        }
    }
}

运行结果:

image-20230421124731866

转载自:

(194条消息) L2-2 病毒溯源 (25 分)(Dfs详细解析)__努力努力再努力_的博客-CSDN博客

标签:Java,get,变异,int,L2,result,new,病毒,溯源
From: https://www.cnblogs.com/galo/p/17339968.html

相关文章

  • L2 - 2 病毒溯源
    代码#include<iostream>#include<vector>#include<algorithm>usingnamespacestd;constintN=10010;vector<int>v[N];boolisroot[N];vector<int>path;vector<int>temppath;intans=0;voiddfs(introot,intlen){......
  • 深度学习基础入门篇[六(1)]:模型调优:注意力机制[多头注意力、自注意力],正则化【L1、L2,D
    深度学习基础入门篇[六(1)]:模型调优:注意力机制[多头注意力、自注意力],正则化【L1、L2,Dropout,DropConnect】等1.注意力机制在深度学习领域,模型往往需要接收和处理大量的数据,然而在特定的某个时刻,往往只有少部分的某些数据是重要的,这种情况就非常适合Attention机制发光发热。举......
  • L2 -4 哲哲打游戏
    题目哲哲是一位硬核游戏玩家。最近一款名叫《达诺达诺》的新游戏刚刚上市,哲哲自然要快速攻略游戏,守护硬核游戏玩家的一切!为简化模型,我们不妨假设游戏有N个剧情点,通过游戏里不同的操作或选择可以从某个剧情点去往另外一个剧情点。此外,游戏还设置了一些存档,在某个剧情点可以将玩......
  • L2 -3 清点代码库
    代码#include<iostream>#include<map>#include<algorithm>#include<vector>usingnamespacestd;map<vector<int>,int>mp;vector<int>temp;intmain(){intn,m;cin>>n>>m;temp.resize(m);......
  • java 实现简单的http服务器
    1、废话不多说,代码如下packagecom.linhuaming.test;importjava.io.IOException;importjava.io.InputStream;importjava.io.OutputStream;importjava.net.ServerSocket;importjava.net.Socket;/***http服务器测试*/publicclassHttpServerTest{publi......
  • JAVA wait(), notify(),sleep详解
    开了博客后,一直也没在上面发布过文章,直到前一段时间与一位前辈的对话,才发现技术博客的重要,立志要把博客建好。但一直没有找到好的开篇的主题,今天再看JAVA线程互斥、同步的时候又有了新的体会,就以他作为开篇吧。   在JAVA中,是没有类似于PV操作、进程互斥等相关的方法的。JAVA的......
  • Java transient关键字
    Volatile修饰的成员变量在每次被线程访问时,都强迫从主内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到主内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。     Java语言规范中指出:为了获得最佳速度,允许线程保存共享成员变量的......
  • L2 - 4 彩虹瓶
    题目彩虹瓶的制作过程(并不)是这样的:先把一大批空瓶铺放在装填场地上,然后按照一定的顺序将每种颜色的小球均匀撒到这批瓶子里。假设彩虹瓶里要按顺序装N种颜色的小球(不妨将顺序就编号为1到N)。现在工厂里有每种颜色的小球各一箱,工人需要一箱一箱地将小球从工厂里搬到装填场地......
  • 在Java代码中更优雅地调用Kotlin
    -Kotlin与Java良好的互操作性是其能够快速普及的原因之一。从Java虽然可以访问Kotlin,但是通过下面这些技巧可以让对Kotlin的访问变得更加友好和地道@JvmStaticKotlin中可以使用objectclass创建单例objectAnalytics{funinit(){...}funsend(event:Event){...}......
  • JAVA中的规则
    是看的尚硅谷的教材粘贴过来的,只是自己记录。如何看懂UML类图?没有好记性就多看几遍UML(UnifiedModelingLanguage,统一建模语言),用来描述软件模型和架的图形化语言。常用的UML工具软件有PowerDesinger、Rose和EnterpriseArchitect.UML工具软件不仅可以绘制软件开发中所......