思路:由于IsConnnected存储的是关系而不是状态,所以不能直接遍历数组来求解,运用BFS的思想,一组省份对应图中的一个极大连通分量,那么就创建一个队列,先找到一个没有被访问过的节点,然后对这个节点进行BFS,并将访问到的节点的状态都设置为访问过。循环此过程知道整个节点表都被访问过。
值得一提的是,在代码中,两种不同的修改访问状态的时机,会使得运行时间产生极大的差别:visited[i]=1,如果是在q.push(i)处直接将该点置为被访问过,然后在bfs中push()后同样修改节点的状态,速度比一开始不修改,而是取出queue节点后再修改节点状态,则会多一倍的运行时间
class Solution {
public:
int findCircleNum(vector<vector<int>>& isConnected) {
int n=isConnected.size();
vector<int> visited(n);
queue<int> q;//用来存储同一个连通分量内的市
int count=0;
for(int i=0;i<n;i++)
{
if(visited[i]==0)//找到一个没有访问过的点
{
q.push(i);//入队
visited[i]=1;//置访问位为1
while(!q.empty()){//BFS遍历,找出所有与该点相连的点
int t=q.front();
q.pop();
//visited[t]=1;//置访问位为1
for(int j=0;j<n;j++){//从该点的下标开始
if(isConnected[t][j]==1&&visited[j]==0)//相连 且 未访问过
{
q.push(j);
visited[j]=1;
}
}
}
count++;
}
}
return count;
}
};