SEERC 2017 D Harry Potter and The Vector Spell
阿新 • • 發佈:2019-01-05
文章目錄
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;
}