每日一题——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++;

浙公网安备 33010602011771号