Harry Potter and The Vector Spell-gym101669D(矩阵的秩-并查集)

简介: 题意:给出一个0 1矩阵,这个矩阵中每一列有且只有两个1,求这个矩阵的秩输入一行中1的数量x,然后后面x个数代表1出现的列位置求出这个矩阵的秩方法:思维并查集将每一列的两个1所在的行编号连一条边,然后求一下最小生成树就好其实就是我们维护一个并查集,在这个并查集里面的所有点都可以两两组合形成一列,如果不在同一个集合里面,就会对答案+1

20210508094455241.png


Sample Input


3 3 
2 1 3 
2 1 2 
2 2 3 


Sample Output

2


Sample Input 2

4 3
3 1 2 3 
1 1
1 2
1 3


20210508103903163.png


Sample Output 2

3


题意:


给出一个0 1矩阵,这个矩阵中每一列有且只有两个1,求这个矩阵的秩

输入一行中1的数量x,然后后面x个数代表1出现的列位置

求出这个矩阵的秩


方法:


思维 并查集

将每一列的两个1所在的行编号连一条边,然后求一下 最小生成树 就好

其实就是我们维护一个并查集,在这个并查集里面的所有点都可以两两组合形成一列,如果不在同一个集合里面,就会对答案+1


int fa[maxn];
int vis[maxn];
int n,m;
inline void init(){
    for(int i=0;i<maxn;i++) fa[i] = i,vis[i] = 0;
}
inline int findFa(int x){
    if(x == fa[x]) return x;
    else return fa[x] = findFa(fa[x]);
}
int ans = 0;
inline void Union(int x,int y){
    int fax = findFa(x);
    int fay = findFa(y);
    if(fax == fay) return ;
    else{
        fa[fax] = fay;
        ans ++;
    }
}
vector<int> vet[maxn];
int main() {
    cin >> m >> n;
    init();
    for(int i=1;i<=m;i++){
        int x=read;
        while(x --){
            int val; cin >>val;
            vet[val].push_back(i);
        }
    }
    for(int i=1;i<=n;i++){
        int x = vet[i][0];
        int y = vet[i][1];
        Union(x,y);
    }
    cout << ans << endl;
  return 0;
}


int n, m;
int fa[maxn];
int vis[maxn];
void init() {
    for (int i = 0; i < maxn; i++)
        fa[i] = i, vis[i] = 0;
}
inline int findFa(int x) {
    if (x == fa[x])
        return x;
    else
        return fa[x] = findFa(fa[x]);
}
inline void Union(int x, int y) {
    int fax = findFa(x);
    int fay = findFa(y);
    if (fax == fay)
        return;
    else {
        fa[fax] = fay;
    }
}
int main() {
    cin >> m >> n;
    init();
    for (int i = 1; i <= m; i++) {
        int x = read;
        for (int j = 1; j <= x; j++) {
            int t = read;
            if (vis[t])
                Union(vis[t], i);
            else
                vis[t] = i;
        }
    }
    int ans = 0;
    for (int i = 1; i <= m; i++) {
        if (i == fa[i])
            ans++;
    }
    cout << m - ans << endl;
    return 0;
}
目录
相关文章
[Eigen中文文档] 无矩阵求解器
本文介绍Eigen的无矩阵求解器。
142 0
|
人工智能
POJ 2299 Ultra-QuickSort(树状数组+离散化+求逆序数)
POJ 2299 Ultra-QuickSort(树状数组+离散化+求逆序数)
(二维vector)(绝对值求和等式的处理)B. Playing in a Casino
(二维vector)(绝对值求和等式的处理)B. Playing in a Casino
90 0
|
Python
【欧拉计划第 8 题】序列中最大的乘积 Largest product in a series
【欧拉计划第 8 题】序列中最大的乘积 Largest product in a series
124 0
【欧拉计划第 8 题】序列中最大的乘积 Largest product in a series
AtCoder Beginner Contest 223 D - Restricted Permutation(建图 思维 构造 拓扑排序)
AtCoder Beginner Contest 223 D - Restricted Permutation(建图 思维 构造 拓扑排序)
130 0
|
索引 Python Java
Leetcode 542:01 矩阵 01 Matrix
题目: 给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离。 两个相邻元素间的距离为 1 。 Given a matrix consists of 0 and 1, find the distance of the nearest 0 for each cell.
786 0