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;
}