并查集--leetcode-547. 省份数量

 

官方题解: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] 为 10 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 }
View Code

 

 

 

posted @ 2021-01-20 09:04  He_LiangLiang  阅读(143)  评论(0编辑  收藏  举报