zoukankan      html  css  js  c++  java
  • 合根植物

    问题描述
      w星球的一个种植园,被分成 m * n 个小格子(东西方向m行,南北方向n列)。每个格子里种了一株合根植物。
      这种植物有个特点,它的根可能会沿着南北或东西方向伸展,从而与另一个格子的植物合成为一体。


      如果我们告诉你哪些小格子间出现了连根现象,你能说出这个园中一共有多少株合根植物吗?
    输入格式
      第一行,两个整数m,n,用空格分开,表示格子的行数、列数(1<m,n<1000)。
      接下来一行,一个整数k,表示下面还有k行数据(0<k<100000)
      接下来k行,第行两个整数a,b,表示编号为a的小格子和编号为b的小格子合根了。


      格子的编号一行一行,从上到下,从左到右编号。
      比如:5 * 4 的小格子,编号:
      1 2 3 4
      5 6 7 8
      9 10 11 12
      13 14 15 16
      17 18 19 20
    样例输入
    5 4
    16
    2 3
    1 5
    5 9
    4 8
    7 8
    9 10
    10 11
    11 12
    10 14
    12 16
    14 18
    17 18
    15 19
    19 20
    9 13
    13 17
    样例输出
    5
    样例说明
      其合根情况参考下图
     
    简单并查集
    代码:
    #include <iostream>
    #include <cstring>
    
    using namespace std;
    
    int n,m,k,a,b,c;
    int f[1000001];
    void init() {
        for(int i = 1;i <= n * m;i ++) {
            f[i] = i;
        }
    }
    int get(int x) {
        return f[x] == x ? x : f[x] = get(f[x]);
    }
    void mer_(int x,int y) {
        f[get(x)] = f[get(y)];
    }
    int main() {
        scanf("%d%d%d",&n,&m,&k);
        init();
        for(int i = 0;i < k;i ++) {
            scanf("%d%d",&a,&b);
            mer_(a,b);
        }
        for(int i = 1;i <= n * m;i ++) {
            if(i == get(i)) c ++;
        }
        printf("%d",c);
    }
  • 相关阅读:
    【笔记】进化型开发方法
    错误注入学习笔记
    【C/C++】关于编译错误 "error C2146: syntax error : missing ';' before identifier 'xxx'"
    查找进程加载到内存中的EntryPoint
    devepxress qtp 点击子菜单
    RijndaelManaged 自定义key和iv
    sql server transaction
    使用gzip压缩字符串
    tsql 与时间(周)相关的一些操作
    excel 合并单元格
  • 原文地址:https://www.cnblogs.com/8023spz/p/10694707.html
Copyright © 2011-2022 走看看