题目描述:
众所周知,只要接触过新冠病毒患者的人就需要被隔离,现在给出了一份接触名单(里面包含该地区所有人的接触记录)和一个确诊病人的编号,请你计算该地区有多少人需要被隔离。
输入描述:
每组测试数据第一行输入一个正整数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;
}