zoukankan      html  css  js  c++  java
  • 并查集

    试题 历届试题 合根植物 

    资源限制
    时间限制:2.0s   内存限制:256.0MB
    问题描述
      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<bits/stdc++.h> 
    #define endl '
    ' 
    using namespace std;
    const int N = 1e6+5;
    typedef long long ll;
    int res;
    int Fat[N];
    int find(int x){
        int r = x;
        while( r != Fat[r]){
            r = Fat[r];
        } 
        int i = x;
        while(i!=r){
            int j = Fat[i];
            Fat[i] = r;
            i = j;
        } 
        return r;
    }
    void merge(int a,int b){
        int fa = find(a),fb = find(b);
        if(fa==fb){
            return ;
        }else{
            Fat[fa] = fb;
            res--;
        }
    }
    int main(){
        ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
         int n,m,k,a,b;
         cin>>m>>n>>k; res = m*n; 
         for(int i = 1;i<=res;i++) Fat[i] = i; 
         while(k--){
             int a,b;
             cin>>a>>b;
             merge(a,b);
        } 
         cout<<res<<endl;
        return 0;
    }
  • 相关阅读:
    Largest Rectangle in Histogram
    Valid Sudoku
    Set Matrix Zeroes
    Unique Paths
    Binary Tree Level Order Traversal II
    Binary Tree Level Order Traversal
    Path Sum II
    Path Sum
    Validate Binary Search Tree
    新手程序员 e
  • 原文地址:https://www.cnblogs.com/SunChuangYu/p/13810823.html
Copyright © 2011-2022 走看看