• 并查集--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

     

     

    作者:小乌龟
    【转载请注明出处,欢迎转载】 希望这篇文章能帮到你

     

  • 相关阅读:
    linux系统的nobody用户
    java包命名规则
    配置文件解析
    jps参数
    Java数据类型总结
    JSON与JAVA数据的相互转换
    maven中使用net.sf.json-lib
    设计 REST 风格的 MVC 框架
    Java 5种字符串拼接方式性能比较
    spring获取webapplicationcontext,applicationcontext几种方法详解
  • 原文地址:https://www.cnblogs.com/music-liang/p/14301115.html
Copyright © 2020-2023  润新知