1. 程式人生 > >BZOJ——3296: [USACO2011 Open] Learning Languages

BZOJ——3296: [USACO2011 Open] Learning Languages

() hellip code learning spa main 語言 get getch

http://www.lydsy.com/JudgeOnline/problem.php?id=3296

Time Limit: 5 Sec Memory Limit: 128 MB
Submit: 254 Solved: 134
[Submit][Status][Discuss]

Description


農夫約翰的N(2 <= N<=10,000)頭奶牛,編號為1.. N,一共會流利地使用M(1<= M <=30,000)種語言,編號從1 .. M.,第i頭,會說K_i(1 <= K_i<= M)種語言,即L_i1, L_i2,..., L_{iK_i} (1 <= L_ij <= M)。 FJ的奶牛不太聰明,所以K_i的總和至多為100,000。

兩頭牛,不能直接交流,除非它們都會講某一門語言。然而,沒有共同語言的奶牛們,可以讓其它的牛給他們當翻譯。換言之,牛A和B可以談話,當且僅當存在一個序列奶牛T_1,T_2,...,T_k,A和T_1都會說某一種語言,T_1和T_2也都會說某一種語言……,並且T_k和B會說某一種語言。
農夫約翰希望他的奶牛更加團結,所以他希望任意兩頭牛之間可以交流。他可以買書教他的奶牛任何語言。作為一個相當節儉的農民,FJ想要購買最少的書籍,讓所有他的奶牛互相可以說話。
幫助他確定:
*他必須購買的書籍的最低數量

Input

*第1行:兩個用空格隔開的整數:N和M

*第2.. N +1行:第i +1行描述的牛i的語言,K_i+1個空格隔開的整數:K_i L_i1
L_i2,...,L_I{K_i}。

Output

*第1行:一個整數,FJ最少需要購買的書籍數量。


	

Sample Input

3 3
2 3 2
1 2
1 1

Sample Output

1

HINT

給三號牛買第二本書即可

Source

Silver

把會相同語言的牛合並到同一個並查集裏,ans=並查集數-1

 1 #include <cstdio>
 2
3 inline void read(int &x) 4 { 5 x=0; register char ch=getchar(); 6 for(; ch>9||ch<0; ) ch=getchar(); 7 for(; ch>=0&&ch<=9; ch=getchar()) x=x*10+ch-0; 8 } 9 const int M(30005); 10 const int N(10005); 11 int n,m,ans,fa[N],bel[M]; 12 13 int find(int x) { return x==fa[x]?x:fa[x]=find(fa[x]); } 14 15 int Presist() 16 { 17 read(n),read(m); 18 for(int i=1; i<=n; ++i) fa[i]=i; 19 for(int t,fx,i=1; i<=n; ++i) 20 { 21 read(t);fx=find(i); 22 for(int x,fy; t--; ) 23 { 24 read(x); 25 if(bel[x]) 26 { 27 fx=find(i),fy=find(bel[x]); 28 if(fx!=fy) fa[fx]=fy; 29 } 30 else bel[x]=i; 31 } 32 } 33 for(int i=1; i<=n; ++i) ans+=(find(i)==i); 34 printf("%d\n",ans-1); 35 return 0; 36 } 37 38 int Aptal=Presist(); 39 int main(int argc,char**argv){;}

BZOJ——3296: [USACO2011 Open] Learning Languages