• 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 }
  • 相关阅读:
    MySQL关键性能监控(QPS/TPS)
    Python小技巧
    Redis高可用演进(一)
    防范XSS攻击
    java引用知识
    ehcache同步原理
    ehcache监控
    SecureCRT使用技巧
    JUC整理笔记五之梳理Varhandle(下)
    JUC整理笔记四之梳理VarHandle(上)
  • 原文地址:https://www.cnblogs.com/baocong/p/7392110.html
Copyright © 2020-2023  润新知