D Harry Potter and The Vector Spell

分析:

并查集合并,在同一并查集的所有点都可以两两组合形成一个列,所以如果两个点在同一个并查集里,不会产生新的秩,否则秩加1

证明

递推证明 当n= 2的时候,共有三个不同的点,显然成立
假设当k的时候成立, 加入新的(a,b),其中a并查集中,b不在并查集中
已知:k个点与a 点 的列都可以组合出来
那么a,b 这个列加入并查集,那么也就可以组合出来这k个点和b的列
原命题成立


const int maxn = 1e5+10;
int  col[maxn][3];
int F[maxn];
int Find(int x){

	return x == F[x]?x:F[x] = Find(F[x]);
}
int main(void)
{
    
   int M,N;
   scanf("%d%d",&M,&N);
   for(int i = 1;i <= M; ++i){
   	int k;
   	scanf("%d",&k);
   	int u;
   	while(k--){
   		scanf("%d",&u);
   		col[u][++col[u][0]] = i;
   	}
   }
   for(int i = 1;i <= M; ++i){
   	 F[i] = i;
   }
   int ans = 0;
   for(int i = 1;i <= N; ++i){
   	  if(col[i][0] == 0) continue;
   	  int xx = Find(col[i][1]);
   	  int yy = Find(col[i][2]);
   	  if(xx == yy) continue;
   	  ans ++;
   	  F[xx] = yy;
   }
   cout<<ans<<endl;

 
   return 0;
}