Provincial problem
问题
给定一个二维数组 vector<vector<int>> arr
,arr[i][j]= 1
表示 i
省和 j
省相连,0
则不相连,求省份个数(相连的省叫做省份)
数据
vector<int> ufs
用于模拟并查集
思路
相连则合并,最终统计
实现
int GetProvince(vector<vector<int>>& arr) { vector<int> ufs(arr.size(),-1); auto FindRoot = [&ufs](int x){ while(ufs[x] >= 0) { x = usf[x]; } return x; }; for(int i = 0;i < arr.size();i++) { for(int j = 0;j < arr[i].size();j++) { if(arr[i][j]) { int root1 = FindRoot(i); int root2 = FindRoot(j); if(root1 != root2) { ufs[root1] += usf[root2]; usf[root2] = root1; } } } } int res = 0; for(auto num:ufs) { if(num < 0) res++; } return res; }
总结
这是不用库函数的做法,实际两者的思想都一样