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 为各种方阵和过约束问题提供的稠密矩阵分解的速度比较。
143 0
|
XML 并行计算 算法
[Eigen中文文档] 求解稀疏线性系统
在Eigen中,有多种方法可用于求解稀疏系数矩阵的线性系统。由于此类矩阵的特殊表示,必须特别小心以获得良好的性能。本文列出了Eigen中可用的稀疏求解器。还介绍了所有这些线性求解器共同的主要步骤。根据矩阵的属性、所需的准确度,最终用户可以调整这些步骤以提高其代码的性能。请注意,并不需要深入了解这些步骤背后的内容:最后一节介绍了一个基础例程,可轻松使用以获取所有可用求解器的性能洞察。
373 0
[Eigen中文文档] 无矩阵求解器
本文介绍Eigen的无矩阵求解器。
156 0
|
算法 Python 机器学习/深度学习
Lesson 2. 矩阵运算基础、矩阵求导与最小二乘法-2
Lesson 2. 矩阵运算基础、矩阵求导与最小二乘法-2
|
机器学习/深度学习 Python
Lesson 2. 矩阵运算基础、矩阵求导与最小二乘法-1
Lesson 2. 矩阵运算基础、矩阵求导与最小二乘法-1
时间复杂度总结(Ο是渐进上界,Ω是渐进下界,p,np,np-hard,NPC问题)
时间复杂度总结(Ο是渐进上界,Ω是渐进下界,p,np,np-hard,NPC问题)
223 0
时间复杂度总结(Ο是渐进上界,Ω是渐进下界,p,np,np-hard,NPC问题)
|
数据挖掘 Serverless Python
Lagrange、Newton、分段插值法及Python实现
Lagrange、Newton、分段插值法及Python实现
Lagrange、Newton、分段插值法及Python实现
codeforces1253——D. Harmonious Graph(并查集)
codeforces1253——D. Harmonious Graph(并查集)
96 0
|
索引
leetcode题解 - 转置矩阵
给你一个二位整数数组matrix,返回matrix的转置矩阵。 矩阵的转置是指将矩阵的主对角线反转,交换矩阵的行索引与列索引
183 0
leetcode题解 - 转置矩阵