题目链接

class Solution { // 1.我的,深度优先 public int findCircleNum1(int[][] arr) { boolean[] bool = new boolean[arr.length]; // 保存省份 int count = 0; for(int i = 0; i < arr.length; i++) { // 查询与1相连或者间接连接的城市 if(bool[i]) continue; count++; // 当前城市被使用 bool[i] = true; // 将其所关联的进行标识 for(int j = 0; j < arr.length; j++) { if(i != j && arr[i][j] == 1) { bool[j] = true; logo(j, bool, arr); } } } return count; } /** * 标识关联的点 */ public void logo(int index, boolean[] bool, int[][] arr) { for(int i = 0; i < bool.length; i++) { if(i != index) { if(!bool[i] && arr[index][i] == 1) { // 有关联 bool[i] = true; // 这里也需要间接查询标识 logo(i, bool, arr); } } } } // 2.老师的深度优先 public int findCircleNum(int[][] arr) { int citys = arr.length; boolean[] visited = new boolean[citys]; int provinces = 0; // 计数器 for(int i = 0; i < citys; i++) { if(!visited[i]) { // 深度优先 dfs(i, citys, visited, arr); provinces++; } } return provinces; } public void dfs(int i, int citys, boolean[] visited, int[][] arr) { for(int j = 0; j < citys; j++) { if(arr[i][j] == 1 && !visited[j]) { visited[j] = true; dfs(j, citys, visited, arr); } } }}