列表

详情


NC205487. 寻找密切接触者

描述

2019-nCoV是一种新型的冠状病毒,其传播能力非常强,目前已经演变成了全球的危机,为了对抗该病毒,隔离感染者及密切接触者是有效的防止扩散的好方法。
为防止病毒传播,某学校开学后采取了很多相关的措施,但是学生之间无论如何是无法避免要交流的,在学校有很多密切接触团体(如一个班级、一个宿舍、一个学习小组等),一个学生可能在多个团体里进行过活动。
一旦发现一个感染者,为了防止疫情扩散,就应该立即找到所有的密切接触者,这里规定,和感染者在一个团体过所有人都是密切接触者,和密切接触者在一个团体的人员也是密切接触者。
请你编程实现,在发现一个感染者的情况下,找出所有的密切接触者。

输入描述

第一行,输入三个正整数n,m,i分别表示学生人数、团体个数、感染者编号(0 < n <= 30000,0 <= m <= 500,1 <= i <=n)
接下来m行
每行一个数字k,k表示该团体人数,接着再输入k个数表示该团体同学的编号

输出描述

输出第一行,一个整数表示密切接触者人数
输出第二行,输出所有的密切接触者编号(编号间隔一个空格,且编号从小到大)

示例1

输入:

10 5 3
3 1 2 3
3 1 4 5
3 1 2 3
3 1 3 4
4 5 6 7 8

输出:

8
1 2 3 4 5 6 7 8

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 49ms, 内存消耗: 760K, 提交时间: 2020-04-25 10:37:47

#include <iostream>
#include<cstdio>
#include<vector>
#include<stack>
#include<queue>
#include<list>
#include<cstring>
#include<set>
#include<map>
#include<cmath>
#include<ctime>
#include<algorithm>
using namespace std;
#define lowbit(x) (x) & -(x)
#define ll long long
const int INF = 0x3f3f3f3f;
int student[30010];
int a[30010];

void init(int n) {
    for (int i = 1; i <= n; i++) {
        student[i] = i;
    }
}

int find1(int x) {
    int r = x;
    while (student[r] != r) r = student[r];
    int j = x;
    while (student[j] != r) {
        int i = j;
        j = student[j];
        student[i] = r;
    }
    return r;
}

void myset(int x, int y) {
    x = find1(x);
    y = find1(y);
    if (student[x] != student[y]);
    student[x] = y;
}

int main() {
    //freopen("data.in", "r", stdin);
    //freopen("practice.out", "w", stdout);
    int n, m, q;
    scanf("%d %d %d", &n, &m, &q);
    init(n);
    for (int i = 1; i <= m; i++) {
        int num,f;
        scanf("%d", &num);
        scanf("%d", &f);
        for (int j = 2; j <= num; j++) {
            int s;
            scanf("%d", &s);
            myset(f, s);
        }
    }
    int check = find1(q);
    int j = 0;
    for (int i = 1; i <= n; i++) {
        if (find1(i) == check)
            a[j++] = i;
    }
    printf("%d\n", j);
    int flag = 0;
    for (int i = 0; i < j; i++) {
        if (!flag)
            flag = 1;
        else
            printf(" ");
        printf("%d", a[i]);
    }
    printf("\n");
    return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 112ms, 内存消耗: 2868K, 提交时间: 2020-05-07 11:25:26

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[3000000];
int f[3000000];
int fin(int x)
{
	if(f[x]==x)
	return x;
	else
	return f[x]=fin(f[x]);
}
int main()
{
	int n,m,k;
	cin>>n>>m>>k;
	for(int i=1;i<=n;i++)
	f[i]=i;
	for(int i=1;i<=m;i++)
	{
		int t;
		cin>>t;
		int x=0,y=0;
		int p;
		for(int j=1;j<=t;j++)
		{
			cin>>p;
			if(x==0)
			x=p;
			else
			{
				if(y==0)
				{
					y=p;
				}
				else
				{
					x=y;
					y=p;
				}
				f[fin(x)]=fin(y);
			}
		}
	}
	int ans=0;
	vector<int>u;
	for(int i=1;i<=n;i++)
	{
		if(fin(i)==fin(k))
		{
			ans++;
			u.push_back(i);
		}
	}
	cout<<ans<<endl;
	for(int i:u)
	cout<<i<<" ";
}

上一题