1. 程式人生 > >SEERC 2017 D Harry Potter and The Vector Spell

SEERC 2017 D Harry Potter and The Vector Spell

文章目錄

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