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);
    }
  • 相关阅读:
    大学阶段最后的交流
    JavaScript的一些基础性知识
    CSS的一些总结
    JavaWeb的一些理解
    Java Web之XML基础
    Java基础增强
    反射的理解
    Java网络编程
    Java 中剩下的流以及线程方面的知识
    Java中的流操作
  • 原文地址:https://www.cnblogs.com/8023spz/p/10694707.html
Copyright © 2011-2022 走看看