Codeforces Round #170 (Div. 2) C. Learning Languages 并查集
链接:
http://codeforces.com/contest/278/problem/C
题意:
有n个员工,m种语言,每名员工可能会几种语言,也可能0门,
问最少需要在学多少门语言,使得任意两个人可以直接或者间接沟通
题解:
不区分员工和语言,直接用并查集就行了,最后就是集合数-1
但是要注意如果所有的人都会0门语言的话,结果就是n
代码:
31 int n, m; 32 int par[220]; 33 int vis[220]; 34 35 int find(int x) { 36 return par[x] = par[x] == x ? x : find(par[x]); 37 } 38 39 void unite(int x, int y) { 40 int a = find(x), b = find(y); 41 if (a != b) par[a] = b; 42 } 43 44 int main() { 45 ios::sync_with_stdio(false), cin.tie(0); 46 cin >> n >> m; 47 rep(i, 0, 220) par[i] = i; 48 int fg = 0; 49 rep(i, 1, n + 1) { 50 int k; 51 cin >> k; 52 if(k) fg = 1; 53 while (k--) { 54 int a; 55 cin >> a; 56 a += 100; 57 unite(i, a); 58 } 59 } 60 if (!fg) return (cout << n << endl), 0; 61 int ans = 0; 62 rep(i, 1, n + 1) if (!vis[find(i)]) { 63 ans++; 64 vis[find(i)] = 1; 65 } 66 cout << ans - 1 << endl; 67 return 0; 68 }