BZOJ——3296: [USACO2011 Open] Learning Languages
阿新 • • 發佈:2017-10-27
() hellip code learning spa main 語言 get getch Time Limit: 5 Sec Memory Limit: 128 MB
2 3 2
1 2
1 1
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 32 3 2
1 2
1 1
Sample Output
1HINT
給三號牛買第二本書即可
Source
Silver
把會相同語言的牛合並到同一個並查集裏,ans=並查集數-1
1 #include <cstdio> 23 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