"""
有 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]

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/number-of-provinces
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
"""

from typing import *


class Solution:
    def union(self, i: int, j: int, father: List[int]):
        p_i = self.find(i, father)
        p_j = self.find(j, father)
        father[p_i] = p_j

    def find(self, p, father: List[int]):
        r = p
        while father[p] != p:
            p = father[p]
        while father[r] != p:
            father[r], r = p, father[r]
        return p

    def findCircleNum(self, isConnected: List[List[int]]) -> int:
        city_num = len(isConnected)
        father = [i for i in range(city_num)]

        for i in range(city_num):
            for j in range(i + 1, city_num):
                if i == j:
                    continue
                if isConnected[i][j] == 1:
                    self.union(i, j, father)

        father_set = set()
        for i in range(city_num):
            p = self.find(i, father)
            father_set.add(p)
        return len(father_set)


if __name__ == '__main__':
    s = Solution()
    print(s.findCircleNum([[1,1,0],[1,1,0],[0,0,1]]))
