2022年第三届辽宁省大学生程序设计竞赛:E-病毒危机

232 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第33天,点击查看活动详情

2022年第三届辽宁省大学生程序设计竞赛——E-病毒危机

E-病毒危机

题目描述

《穿越到提瓦特大陆然后成为战力第一的旅行者结果带来了L病毒而被迫走上拯救世界的道路》堂堂连载!

你是旅行者,由于未知原因,你穿越到了提瓦特,遇到了各种各样的角色,游历了风格各异的地方,成为了战力第一。但可怕的是,你为这个世界带来了一种本不属于这个世界的L病毒,这种L病毒传染性强,一旦这种病毒散播开来,后果不堪设想。

我们可以认为,如果旅行者去过一个地点,则到过该地点的人们全部都会被感染L病毒。现在找到了n个人(其中第1个人是旅行者,是初始感染了L病毒的人),分别得知了n个人到过的地方。注意,被旅行者感染的人没有感染别人的能力。你需要计算出最坏情况下,也就是最后的感染L病毒人数。

输入描述:

第一行有两个整数,分别为n和m,n表示人数,m表示地点数。
接下来n行,第i+1行第一个正整数为KiK_iKi,接下来有KiK_iKi个不重复的整数,第j个整数AijA_{ij}Aij代表第i个人到过的第j个地点编号。
(1≤n≤1000001≤m≤100000)(ΣKi≤5000001≤Aij≤m)

输出描述:

共一行一个整数,为最后的感染L病毒人数。              

输入

2 3
2 1 2
2 2 3

输出

2

说明

第一个人和第二个人都去过地点2,则第二个人被感染。最后感染人数为2。

问题解析

用哈希表记录下第一个人去过的地方,只要后面的人去过的地方有第一个人去过的,这个人就会被感染。

AC代码

void solve()
{
    int n, m, len, x, cnt = 1;
    cin >> n >> m;
    unordered_map<int, int>mymap;
    for (int i = 1; i <= n; i++)
    {
        cin >> len;
        bool flag = false;
        for (int j = 1; j <= len; j++)
        {
            cin >> x;
            if (i == 1)
                mymap[x]++;
            else if (mymap.count(x))flag = true;
        }
        if (flag)cnt++;
    }
    cout << cnt;
}