• (简单并查集)How many tables?


    很简单的并查集裸题了,基本没啥需要额外维护的信息,题目分两步解决,

    第一步:先将有关系的元素放到一个集合里面。

    第二步:将所有有公共关系的元素都在一个bool数组里标记为true,之后遍历

    的时候将false的元素,也就是没有公共关系的元素挨个累加(一个元素在一个桌子),

    然后对于那些为true的元素,因为他们都是在一个桌子里的,因此只要判断他们的

    父节点是不是自己,如果是就加一。

     1 #include <iostream>
     2 #include <algorithm>
     3 using namespace std;
     4 const int N = 1010;
     5 bool vis[N];
     6 int fa[N];
     7 int find(int x){
     8     if(x != fa[x]) fa[x] = find(fa[x]);
     9     return fa[x];
    10 }
    11 int main(){
    12     int t;
    13     cin >> t;
    14     while(t --){
    15         int n, m, ans = 0;
    16         cin >> n >> m;
    17         for(int i = 1; i <= n; i ++) fa[i] = i;
    18         for(int i = 1; i <= m; i ++){
    19             int a, b;
    20             cin >> a >> b;
    21             if(find(a) != find(b)){
    22                 fa[find(a)] = find(b);
    23                 vis[find(a)] = true;
    24                 vis[a] = true;
    25             }
    26         }
    27         for(int i = 1; i <= n; i ++){
    28             if(!vis[i])
    29                 ans ++;
    30             else
    31                 if(i == fa[i])
    32                     ans ++;
    33         }
    34         cout << ans << endl;
    35     }
    36 
    37     return 0;
    38 }
  • 相关阅读:
    内存
    TCP/IP
    安装
    linux常用命令
    linux文本处理三剑客之 grep
    tail命令:显示文件结尾的内容
    less命令:查看文件内容
    head命令:显示文件开头内容
    改进Zhang Suen细化算法的C#实现
    【转】在VS2010上使用C#调用非托管C++生成的DLL文件(图文讲解)
  • 原文地址:https://www.cnblogs.com/pureayu/p/13654823.html
Copyright © 2020-2023  润新知