每日一题——547. 省份数量

分类:

  • 并查集
class Solution {
public:
    int root(int* u, int j){ //找到j的集合根 
        while(j != u[j]) j = u[j];
        return j;
    }

    void combine(int* u, int i, int j){ //把j接到i上 
        u[root(u, j)] = root(u, i); 
    }

    int findCircleNum(vector<vector<int>>& isConnected) {
        int n = isConnected.size();
        int* u = new int[n];
        for(int i=0; i<n; i++) u[i]=i;

        for(int i=0; i<n-1; i++){
            for(int j=i+1; j<n; j++){
                if(isConnected[i][j]) combine(u, i, j);
            }
        }

        set<int> s;
        for(int i=0; i<n; i++) s.insert(root(u, i));
        return s.size();

    }
};
/* 91.5% **/

错误1,两个集的合并应该是根进行合并,而不是单个点的合并

优化。不使用辅助set怎么判断集合个数?根等于自己代表这是集合的顶部,数出来就有几个集合。

for(i range n) if(u[i] == i) cnt++;

posted @ 2021-01-07 11:41  vwmin  阅读(66)  评论(0)    收藏  举报