题目大意:0号学生是流感疑似病人,找出与0接触及与0间接接触的人(与0接触的人接触的人)的个数
解决:并查集,找出与0同在一个集合的所有元素的个数
#include <iostream> #include <cstring> using namespace std; int num[30005]; bool mark[30005]; int find(int x) { if(num[x]<0)return x; return num[x]=find(num[x]); } void merge(int a,int b) { int fa=find(a); int fb=find(b); if(fa==fb)return; int t=num[fa]+num[fb]; if(num[fa]>num[fb]){num[fa]=fb;num[fb]=t;} else {num[fb]=fa;num[fa]=t;} } int main() { int n,m; while(cin>>n>>m,n) { memset(num,-1,sizeof(num)); memset(mark,false,sizeof(mark)); int k,t,a; while(m--) { cin>>k; cin>>t; mark[t]=true;; while(--k) { cin>>a; mark[a]=true; merge(t,a); } } int count=1; int root0=find(0);//找出0所在的集合,因为0在所有集合中都是疑似病人 for(int i=1;i<n;i++)//在所有学生中找出在集合某一个集合而且与0号接触或者间接接触的人 if(mark[i] && find(i)==root0 )count++; cout<<count<<endl; } // system("pause"); return 0; }