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;
}
目录
相关文章
|
8月前
[Eigen中文文档] 无矩阵求解器
本文介绍Eigen的无矩阵求解器。
60 0
|
算法 Python 机器学习/深度学习
Lesson 2. 矩阵运算基础、矩阵求导与最小二乘法-2
Lesson 2. 矩阵运算基础、矩阵求导与最小二乘法-2
|
机器学习/深度学习 Python
Lesson 2. 矩阵运算基础、矩阵求导与最小二乘法-1
Lesson 2. 矩阵运算基础、矩阵求导与最小二乘法-1
(二维vector)(绝对值求和等式的处理)B. Playing in a Casino
(二维vector)(绝对值求和等式的处理)B. Playing in a Casino
60 0
【每日一题Day98】LCLC1632矩阵转换后的秩 | TreeMap+并查集
然后遍历TreeMap,使用并查集处理存在相同元素时的情况,将元素分为几个连通块,对于每个连通块,里面所有元素对应的秩为这些行或列的最大秩加 1。
68 0
|
机器学习/深度学习 移动开发 数据建模
Python求解拉普拉斯矩阵及其特征值
一、背景介绍 1.1 图论基础 定义一(图的邻接矩阵):
961 0
Python求解拉普拉斯矩阵及其特征值
|
C语言 UED
[解题报告]【第33题】给定一个 n X n 的矩阵,求它的转置矩阵
[解题报告]【第33题】给定一个 n X n 的矩阵,求它的转置矩阵
|
索引
leetcode题解 - 转置矩阵
给你一个二位整数数组matrix,返回matrix的转置矩阵。 矩阵的转置是指将矩阵的主对角线反转,交换矩阵的行索引与列索引
150 0
leetcode题解 - 转置矩阵
|
索引 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.
757 0