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);
    }
  • 相关阅读:
    树状数组
    线段树
    最短路(FLOYD)
    欧拉函数
    筛素数
    并查集
    背包方案数问题(礼物)
    [BeijingWc2008]雷涛的小猫
    受欢迎的牛[HAOI2006]
    删除物品[JLOI2013]
  • 原文地址:https://www.cnblogs.com/8023spz/p/10694707.html
Copyright © 2011-2022 走看看