2021天梯赛L2-038 病毒溯源

病毒溯源
题目描述:
病毒总类总数n,编号0~n-1,n行数据,第i行对应编号i-1病毒的变异毒株种类个数及编号,要求输入最长变异序列长度以及变异链,长度相等时输出最小序列,注意题目保证病毒源头有且仅有一个。

#include<bits/stdc++.h>
using namespace std;
const int N=10010,M=1000010;
vector<vector<int> >g; 
int n,cnt;
bool vis[N];
vector<int>ans,temp;
void dfs(int u,int sum){
    if(sum>cnt){
        cnt=sum;
        ans=temp;
    }
    else if(sum==cnt&&temp<ans){
        ans=temp;
    }
    for(int i=0;i<g[u].size();++i){
        int v=g[u][i];
        temp.push_back(v);
        dfs(v,sum+1);//回溯 
        temp.pop_back();
    }
}
int main(){
    int n;
    cin>>n;
    g.resize(n+1);//申请空间 
    for(int i=0;i<n;++i){
        int k;
        cin>>k;
        while(k--){
            int x;
            cin>>x;
            vis[x]=true;
            g[i].push_back(x);
        }
    }
    int root=0;
    while(vis[root])root++;//由于只有一个病毒源头所以可以这样找到根病毒 
    dfs(root,1);//从根开始dfs找到最长的最小序列
    cout<<cnt<<endl;
    cout<<root;
    for(int i=0;i<ans.size();++i)
    cout<<" "<<ans[i]; 
    return 0;
}
全部评论

相关推荐

每晚夜里独自颤抖:你cet6就cet6,cet4就cet4,你写个cet证书等是什么意思。专业技能快赶上项目行数,你做的这2个项目哪里能提现你有这么多技能呢
点赞 评论 收藏
分享
鬼迹人途:你去投一投尚游游戏,服务器一面,第一个图算法,做完了给你一个策略题,你给出方案他就提出低概率问题,答不上当场给你挂
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务