官方题解:https://leetcode-cn.com/problems/number-of-provinces/solution/sheng-fen-shu-liang-by-leetcode-solution-eyk0/
547. 省份数量 有 n 个城市,其中一些彼此相连,另一些没有相连。
如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,
那么城市 a 与城市 c 间接相连。 省份 是一组直接或间接相连的城市,
组内不含其他没有相连的城市。 给你一个 n x n 的矩阵 isConnected ,
其中 isConnected[i][j] = 1
表示第 i 个城市和第 j 个城市直接相连,
而 isConnected[i][j] = 0 表示二者不直接相连。
返回矩阵中 省份 的数量。 示例 1: 输入:isConnected = [[1,1,0],[1,1,0],[0,0,1]] 输出:2
示例 2: 输入:isConnected = [[1,0,0],[0,1,0],[0,0,1]] 输出:3 提示: 1 <= n <= 200 n == isConnected.length n == isConnected[i].length isConnected[i][j] 为 1 或 0 isConnected[i][i] == 1 isConnected[i][j] == isConnected[j][i]
1 #include <iostream> 2 #include <vector> 3 using namespace std; 4 5 class Solution_BCJ { 6 public: 7 //找到index的祖先结点 8 int Find(vector<int>& parent, int index) 9 { 10 if (parent[index] != index) 11 { 12 parent[index] = Find(parent, parent[index]); 13 } 14 return parent[index]; 15 } 16 17 //index1的祖先 点指向 index2的祖先 18 void Union(vector<int>& parent, int index1, int index2) 19 { 20 parent[Find(parent, index1)] = Find(parent, index2); 21 } 22 23 //打印parent数组,方便我们查看具体更新内容 24 void printParent(vector<int>& parent) 25 { 26 cout << "printParent------>>>" << endl; 27 for (auto val : parent) 28 { 29 cout << val << ","; 30 } 31 cout << endl << "===========================" << endl; 32 } 33 34 int findCircleNum(vector<vector<int>>& isConnected) 35 { 36 int provinces = isConnected.size(); 37 vector<int> parent(provinces); 38 printParent(parent); //打印parent数组,方便我们查看具体更新内容 39 for (int i = 0; i < provinces; i++) 40 { 41 parent[i] = i; 42 } 43 44 //这是无向图,遍历左下角是重复的操作...(这里的union是将2个点的祖先合并) 45 for (int i = 0; i < provinces; i++) 46 { 47 for (int j = i + 1; j < provinces; j++) 48 { 49 if (isConnected[i][j] == 1) 50 { 51 cout << "union i,j: (" << i << "," << j << ")" << endl; 52 Union(parent, i, j); 53 printParent(parent); //打印parent数组,方便我们查看具体更新内容 54 } 55 } 56 } 57 58 cout << "++++++++++++++++++++++" << endl; 59 printParent(parent); //打印parent数组,方便我们查看具体更新内容 60 int circles = 0; 61 for (int i = 0; i < provinces; i++) 62 { 63 //parent[i]!=i 即表示该点已经和别的点相连了。。所以只需要计算出parent[i]=i这样的点的个数 64 if (parent[i] == i) 65 { 66 circles++; 67 } 68 } 69 70 return circles; 71 } 72 }; 73 74 int main() 75 { 76 /************************************************************************/ 77 /* 并查集--省份数量 */ 78 /************************************************************************/ 79 80 // 测试用例 81 /** 82 [ 83 [1,0,0,1], 84 [0,1,1,0], 85 [0,1,1,1], 86 [1,0,1,1] 87 ] 88 */ 89 Solution_BCJ shenfen; 90 vector<vector<int>> isConnected; 91 vector<int> oneConnect; 92 93 oneConnect.clear(); 94 oneConnect.emplace_back(1); oneConnect.emplace_back(0); oneConnect.emplace_back(0); oneConnect.emplace_back(1); 95 isConnected.emplace_back(oneConnect); 96 97 oneConnect.clear(); 98 oneConnect.emplace_back(0); oneConnect.emplace_back(1); oneConnect.emplace_back(1); oneConnect.emplace_back(0); 99 isConnected.emplace_back(oneConnect); 100 101 oneConnect.clear(); 102 oneConnect.emplace_back(0); oneConnect.emplace_back(1); oneConnect.emplace_back(1); oneConnect.emplace_back(1); 103 isConnected.emplace_back(oneConnect); 104 105 oneConnect.clear(); 106 oneConnect.emplace_back(1); oneConnect.emplace_back(0); oneConnect.emplace_back(1); oneConnect.emplace_back(1); 107 isConnected.emplace_back(oneConnect); 108 109 110 // 前面都是输入数据,主要就是执行下面这个方法 111 int circles = shenfen.findCircleNum(isConnected); 112 cout << "shenfen circles: " << circles << endl; 113 114 system("PAUSE"); 115 return 0; 116 }