zoukankan      html  css  js  c++  java
  • codeforces1013D

    Chemical table

    题目大意

    对于一个n*m的矩阵中给你q个点,现在对于如下形式是可以转换的
    img

    问你还需添加多少个点可以使得所有点都被填满。

    数据范围

    1n,m200000,0qmin(nm,200000),1rin,1cim

    解题思路

    首先对于所有第a行的被填过的点设为集合S,如果b行的某个点的与S中的某点同列,那么对应就能填上所有在b行与集合S同列的点,相应的对于列也是一样。那么这些行和列就能被看做为一个集合,当两个集合合并时,只需要添加一个点就能使得两个集合合并,所以最后答案就是集合个数减一。

    AC代码

    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    const int maxn = 200000;
    int n, m, q;
    int fa[maxn * 2 + 5];
    int Find(int x) {
        if(fa[x] == x)return x;
        return fa[x] = Find(fa[x]);
    }
    void Union(int x, int y) {
        x = Find(x);
        y = Find(y);
        if(x != y)fa[y] = x;
    }
    int main() {
        scanf("%d%d%d", &n, &m, &q);
        for(int i = 1; i <= n + m; i++)fa[i] = i;
        for(int i = 1; i <= q; i++) {
            int r, c; scanf("%d%d", &r, &c);
            Union(r, n + c);
        }
        int cnt = 0;
        for(int i = 1; i <= n + m; i++)if(fa[i] == i)cnt++;
        printf("%d
    ", cnt - 1);
        return 0;
    }
  • 相关阅读:
    多边形游戏
    大整数乘法
    矩阵连乘
    最长公共子序列
    动态规划
    快速排序
    二分搜索技术
    动态规划基本要素
    合并排序
    最大子段和
  • 原文地址:https://www.cnblogs.com/TRDD/p/9813505.html
Copyright © 2011-2022 走看看