题解 61| DFS/BFS实现连通分量的统计#城市群数量#
城市群数量
https://www.nowcoder.com/practice/71cde4dee669475f94d8d38832374ada
一、DFS(一样的时空复杂度)
#include <vector>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param m int整型vector<vector<>>
* @return int整型
*/
void dfs(vector<vector<int>>& m,int nowCity,vector<bool>& vis){
vis[nowCity] = true;// 标记当前城市为已访问
for (int i = 0; i < m.size(); i++) {
// 如果当前城市与其他城市相连 且 其他城市未被访问过
if (m[nowCity][i] == 1 && !vis[i]) {
dfs(m, i, vis);// 继续深度优先搜索
}
}
}
int citys(vector<vector<int>>& m) {
int citysCount = 0;// 城市群的数量
vector<bool> vis(m.size(),false);// 记录城市是否已经被访问过
for (int i = 0; i < m.size(); i++) {
if (!vis[i]) {// 如果当前城市未被访问过
dfs(m, i, vis);// 从当前城市开始进行深度优先搜索
citysCount++; // 城市群数量加一
}
}
return citysCount;
}
};
算法思想:
使用深度优先搜索(DFS)算法来遍历所有城市,然后统计城市群的数量。
时间复杂度:
遍历所有城市需要O(n)的时间复杂度,每个城市进行深度优先搜索的时间复杂度为O(n),所以总的时间复杂度为O(n^2)。
空间复杂度:
需要额外的矩阵空间来存储城市是否被访问过的信息,所以空间复杂度为O(n)。
二、BFS(一样的时空复杂度)
#include <vector>
#include <queue>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param m int整型vector<vector<>>
* @return int整型
*/
void bfs(vector<vector<int>>& m, int start, vector<bool>& vis) {
queue<int> q;
q.push(start);// 将起始城市加入队列
vis[start] = true;// 标记起始城市为已访问
while (!q.empty()) {
int nowCity = q.front();
q.pop();
for (int i = 0; i < m.size(); i++) {
// 如果当前城市与其他城市相连 且 其他城市未被访问过
if (m[nowCity][i] == 1 && !vis[i]) {
q.push(i);// 将相连的城市加入队列
vis[i] = true;// 标记相连的城市为已访问
}
}
}
}
int citys(vector<vector<int>>& m) {
int citysCount = 0;// 城市群的数量
vector<bool> vis(m.size(), false); // 记录城市是否已经被访问过
for (int i = 0; i < m.size(); i++) {
if (!vis[i]) {// 如果当前城市未被访问过
bfs(m, i, vis);// 从当前城市开始进行深度优先搜索
citysCount++; // 城市群数量加一
}
}
return citysCount;
}
};
算法思想:
使用广度优先搜索(BFS)算法来遍历所有城市,然后统计城市群的数量。从一个起始城市开始,将其加入队列,然后依次访问队列中的城市,并将其相连的未访问过的城市加入队列,直到队列为空。
时间复杂度:
遍历所有城市需要O(n)的时间复杂度,每个城市进行广度优先搜索的时间复杂度为O(n),所以总的时间复杂度为O(n^2)。
空间复杂度:
需要额外的队列空间来存储城市是否被访问过的信息和队列,所以空间复杂度为O(n)。
2024考研数据结构 文章被收录于专栏
本人考研刷算法题,立此专栏练习强化。
