ZJYYCOJ-找出疑似病例

题目描述:
众所周知,只要接触过新冠病毒患者的人就需要被隔离,现在给出了一份接触名单(里面包含该地区所有人的接触记录)和一个确诊病人的编号,请你计算该地区有多少人需要被隔离。

输入描述:
每组测试数据第一行输入一个正整数T(0<T<=5)开始,表示有T组数据 每组数据第一行输入两个整数n,m(0<n<=100000,0<m<=1000)开头,表示改地区有n个人和给出了m份接触名单。 接下来m行,每行首先输入一个整数k表示该行接下来输入k(0<k<=1000)个数据,表示这k个人曾接触过。 最后给出输入一个编号A,代表着确诊病人的编号(编号从0开始,到n-1结束)

输出描述:
输出需要被隔离的人数(包括确诊病人)

测试样例:
样例输入 1

1

5 2

2 1

2 3

0 3

4 1

样例输出 1

2

思路:并查集

#include<bits/stdc++.h>

using namespace std;
int s[100005];
int a[100005];
void csh(int x){
    for (int i = 0 ; i < x ;i++){
        s[i] = i;
    }
}
int findx(int x){
    if (s[x] == x){
        return x;
    }
    else{
        return s[x] = findx(s[x]);
    }
}
void merge(int x,int y){
    x = findx(x),y = findx(y);
    if (x != y){
        s[x] = y;
    }
}
int main() {
    ios::sync_with_stdio(false);
    int t;
    cin>>t;
    while (t--){
        int n,m;
        cin>>n>>m;
        csh(n);
        while (m --){
            int k;
            cin>>k;
            for (int i = 0 ; i < k ;i++){
                cin>>a[i];
                merge(a[0],a[i]);
            }
        }
        int cnt = 0;
        int p;
        cin>>p;
        for (int i = 0 ; i < n ;i++){
            if (findx(p) == findx(s[i])){
                cnt++;
            }
        }
        cout<<cnt<<endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值