问题:获取的是一个图,可初始化成二维数组,表示元素之间的连接关系。要求的是最大连通子图相关问题。
思路:
1、获取元素数量
2、定义visited[]数组,标识某元素是否已经被访问
3、定义计数器,记录连通子图数量(根据题目要求定义)
4、初始化一个队列,记录入队出队元素
5、广度优先遍历步骤:
(1)for循环访问每一个没被访问过的元素
(2)将没被访问过的元素入队
(3)如果队列不空,将队头元素出队(标记为已访问)。与此同时,遍历元素,将与出队的元素相联且没被访问过的入队。while循环重复此操作,直到队列为空,表示一个极大连通子集以已完成。
6、代码
(力扣)力扣547
class Solution {
public int findCircleNum(int[][] isConnected) {
//BFS
//1、定义元素个数
int citys = isConnected.length;
//2、定义visited集合
boolean[] visited =new boolean[isConnected.length];
//3、定义计数变量
int proviences = 0;
//4、初始化队列
Queue<Integer> queue = new LinkedList<Integer>();
//5、遍历未访问的元素
for(int i=0;i<citys;i++){
if(!visited[i]){
queue.offer(i);
//队不空
while(!queue.isEmpty()){
int k = queue.poll();
visited[k]=true;//出队置true,并将与之相联的入队
for(int j=0;j<citys;j++){
if(isConnected[k][j]==1&&!visited[j]){
queue.offer(j);
}
}
}
//队空一次,找到一个极大连通子图
proviences++;
}
}
return proviences;
}
}