1. class Solution:
  2. def findCircleNum(self, isConnected: List[List[int]]) -> int:
  3. n = len(isConnected)
  4. visited =set() # 使用列表可以减小一点开销
  5. cnt =0
  6. def dfs(pos):
  7. for i in range(n): # 对该城市搜索所有相邻城市
  8. if isConnected[pos][i] and i not in visited :
  9. visited.add(i)
  10. dfs(i)
  11. for i in range(n): # 开始遍历所有城市
  12. if i not in visited: # 开始时也会加一个判断是否访问过
  13. dfs(i) # 如果没有访问则进行深度优先搜索,将其相邻城市标记为访问
  14. cnt+=1
  15. return cnt

Warshall 算法通过求可达矩阵,对上三角进行遍历

class Solution:
    def findCircleNum(self, isConnected: List[List[int]]) -> int: 
        n = len(isConnected)

        for j in range(n):
            for i in range(n):
                if isConnected[i][j]==1:
                    for k in range(n):
                        isConnected[i][k]|= isConnected[j][k]
        cnt=0
        for i in range(n):
            flag =0 
            if isConnected[i][i]==0:continue
            for j in range(i,n):
                if  isConnected[i][j]==1:
                    isConnected[j][j]=0
                    if not flag:
                        cnt+=1
                        flag=1
        return cnt