LeetCode547:省份數量
阿新 • • 發佈:2021-01-17
技術標籤: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)