1. 程式人生 > 其它 >LeetCode547:省份數量

LeetCode547:省份數量

技術標籤:LeetCode演算法dfsleetcodepython資料結構

目錄

一、題目

二、示例

三、思路

四、程式碼


一、題目

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]

三、思路

可以把 n 個城市和它們之間的相連關係看成圖城市

是圖中的節點相連關係是圖中的,給定的矩陣 isConnected即為圖的鄰接矩陣省份即為圖中的連通分量

計算省份總數,等價於計算圖中的連通分量數,可以通過深度優先搜尋

四、程式碼

class Solution:
    def findCircleNum(self, isConnected) -> int:
        """
        :param isConnected: List[List[int]]
        :return: int
        """
        n = len(isConnected)
        # 鄰接矩陣,圖的深度優先遍歷演算法,計算連通分量的個數,即省份的個數

        visited = [0 for _ in range(n)]  # visited = [0, 0, 0] 表示該點是否遍歷

        # 深度優先遍歷
        def DFSTraverse(graph):
            """
            :param graph: List[List[int]]
            :return: int
            """
            counts = 0
            for i in range(n):
                if not visited[i]:
                    # print('*' * 10)
                    # print('第{}次深度遍歷'.format(counts + 1))
                    DFS(graph, i)
                    counts += 1
            return counts

        # 以下標為i的頂點進行遍歷,進行一次深度優先遞迴,對於連通圖,可以訪問到所有的頂點
        def DFS(graph, i):
            visited[i] = 1
            # print(i + 1)
            for j in range(n):
                if graph[i][j] == 1 and not visited[j]:
                    DFS(graph, j)

        res = DFSTraverse(isConnected)
        return res

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