题目链接
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);
}
}
}
}