1. 程式人生 > >Codeforces 278C Learning Languages(並查集) 求連通塊

Codeforces 278C Learning Languages(並查集) 求連通塊

pre union get code fin const turn find ons

Codeforces 278C Learning Languages(並查集) 求連通塊
為什麽最後還要getfather 一遍 比如 x 是 y 的父親
然後你 Union(x,z) 然後 z 變成了 x 父親 然後 y 的祖先就是錯的了


題解 求一個無向圖中有幾個連通塊 sum
特判 一下 如果 每一個人的語言都為 0 則答案為 sum
其他 答案則為 sum - 1

 1 #include <bits/stdc++.h>
 2 using namespace std ; 
 3 
 4 const int N = 111 ; 
 5 int
n,m,k,x,sum ; 6 int fa[N*2] ; 7 bool flag ; 8 9 inline int find(int x) 10 { 11 if(fa[x]==x) return x ; 12 return fa[ x ] = find(fa[ x ]) ; 13 } 14 15 inline void Union(int x,int y) 16 { 17 x = find(x) ; y = find(y) ; 18 if(x!=y) fa[ x ] = y ; 19 } 20 21 int main() 22
{ 23 scanf("%d%d",&n,&m) ; 24 for(int i=1;i<=n+m;i++) fa[ i ] = i ; 25 flag = 0 ; 26 for(int i=1;i<=n;i++) 27 { 28 scanf("%d",&k) ; 29 if(k) flag = 1 ; 30 for(int j=1;j<=k;j++) 31 scanf("%d",&x) ,Union( i,x+n ) ;
32 } 33 if(!flag) 34 { 35 printf("%d\n",n) ; 36 return 0 ; 37 } 38 for(int i=1;i<=n;i++) fa[ i ] = find(fa[ i ]) ; 39 sort(fa+1,fa+n+1) ; 40 fa[ 0 ] = -100 ; 41 for(int i=1;i<=n;i++) if(fa[ i ]!=fa[ i-1 ]) sum++ ; 42 43 printf("%d\n",sum-1) ; 44 45 return 0 ; 46 }

Codeforces 278C Learning Languages(並查集) 求連通塊