列表

详情


NC345. 城市群数量

描述

给定一个 n 个节点的邻接矩阵 m。 节点定义为城市,如果 a 城市与 b 城市相连, b 与 c 城市相连,尽管 a 与 c 并不直接相连,但可以认为 a 与 c 相连,定义 a,b,c 是一个城市群。
矩阵 m[i][j] = 1 表示第 i 个城市和第 j 个城市直接相连,否则表示不相连。
请你找出共有多少个城市群。

数据范围: , 矩阵中只包含

示例1

输入:

[[1,1,0],[1,1,0],[0,0,1]]

输出:

2

说明:

1 2 相连,3 独立,因此是 3 个城市群。

示例2

输入:

[[1,1,0,0],[1,1,1,0],[0,1,1,0],[0,0,0,1]]

输出:

2

说明:

1 , 2相连 ;2 ,3相连,4独立,因此是 1,2,3 属于一个城市群,4属于一个城市群。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 6ms, 内存消耗: 776KB, 提交时间: 2022-05-18

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param m int整型vector<vector<>> 
     * @return int整型
     */
    vector<int> num;
    int parent[200*200];
    int cnt = 0;
    int Find(int x){
        int root = x;
        while(root!=parent[root]){
            root = parent[root];
        }
        while(x!=parent[x]){
            int tmp = parent[x];
            parent[x] = root;
            x = tmp;
        }
        return root;
    }
    void Union(int x, int y){
        int proot = Find(x);
        int qroot = Find(y);
        if(proot==qroot)
            return;
        parent[proot] = qroot;
        cnt--;
    }
    int citys(vector<vector<int> >& m) {
        // write code here
        int n = m.size();
        cnt = n;
        if(n<=0)
            return 0;
        for(int i=0;i<n;i++)
            parent[i] = i;
        for(int i=0;i<n;i++){
            for(int j=0;j<i;j++){
                if(m[i][j]==1 && i!=j)
                    Union(i, j);
            }
        }
        return cnt;
    }
};

C++ 解法, 执行用时: 6ms, 内存消耗: 776KB, 提交时间: 2022-05-15

class UF {
public:
    UF() = default;
    UF(int n) {
        cnt = n;
        parent.resize(n);

        for (int i = 0; i < n; i++) {
            parent[i] = i;
        }
    }

    int find(int x) {
        while (x != parent[x]) {
            parent[x] = parent[parent[x]];
            x = parent[x];
        }
        return x;
    }

    void ufUnion(int p, int q) {
        int pRoot = find(p);
        int qRoot = find(q);
        if (pRoot == qRoot) return;

        parent[pRoot] = qRoot;
        cnt--;
    }

    bool isConnected(int p, int q) {
        return find(p) == find(q);
    }

    int count() {
        return cnt;
    }

private:
    int cnt;
    vector<int> parent;
};

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param m int整型vector<vector<>>
     * @return int整型
     */
    int citys(vector<vector<int> >& m) {
        // write code here
        int n = m.size();
        UF uf(n);
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (m[i][j] == 1)
                    uf.ufUnion(i, j);
            }
        }
        
        return uf.count();
    }
};

C++ 解法, 执行用时: 6ms, 内存消耗: 780KB, 提交时间: 2022-04-11

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param m int整型vector<vector<>> 
     * @return int整型
     */
    int *fa;
    int citys(vector<vector<int> >& m) {
        // write code here
        int n = m.size();
        
        Init(m);
        
        for(int i = 1; i < n; i++)
        {
            for(int j = 0; j < i; j++)
            {
                if(m[i][j] == 1)
                {
                    Merge(i,j);
                }
            }
        }
        
        int res = 0;
        for(int i = 0; i < n; i++)
        {
            if(fa[i] == i)
            {
                res++;
            }
        }
        return res;
    }
    
    void Init(vector<vector<int> >& m)
    {
        int n = m.size();
        fa = new int[n];
        for(int i = 0; i < n; i++)
        {
            fa[i] = i;
        }
    }
    
    int Find(int i)
    {
        if(fa[i] == i)
        {
            return i;
        }
        else
        {
            fa[i] = Find(fa[i]);
            return fa[i];
        }
    }
    
    void Merge(int i, int j)
    {
        int a_i = Find(i);
        int a_j = Find(j);
        fa[a_i] = a_j;
    }
};

C 解法, 执行用时: 7ms, 内存消耗: 660KB, 提交时间: 2022-06-27

void dfs(int** m, int i, int colLen, int* a) {
    a[i] = 1;
    for (int j = 0; j < colLen; j++) {
        if (m[i][j] == 1 && a[j] == 0) {dfs(m, j, colLen, a);}
    }
}
int citys(int** m, int mRowLen, int* mColLen ) {
    int a[mRowLen];
    memset(a, 0, sizeof(a));
    int sum = 0;
    for (int i = 0; i < mRowLen; i++) {
        if (a[i] == 0) {
            sum++;
            dfs(m, i, *mColLen, a);
        }
    }
    return sum;
}

C 解法, 执行用时: 7ms, 内存消耗: 740KB, 提交时间: 2022-06-26

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param m int整型二维数组 
 * @param mRowLen int m数组行数
 * @param mColLen int* m数组列数
 * @return int整型
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
void dfs(int** m, int i, int colLen, int *visited) {
    visited[i] = 1;
    
    for (int j = 0; j < colLen; j++) {
        if (m[i][j] == 1 && visited[j] == 0) {
            dfs(m, j, colLen, visited);
        }
    }
}

int citys(int** m, int mRowLen, int* mColLen ) {
    int visited[mRowLen];
    memset(visited, 0, sizeof(visited));
    int mapCount = 0;
    
    for (int i = 0; i < mRowLen; i++) {
        if (visited[i] == 0) {
            mapCount++;
            dfs(m, i, *mColLen, visited);
        }
    }
    
    return mapCount;
}

上一题