非递归的深度优先遍历求联通分量的代码
时间: 2023-06-03 22:07:22 浏览: 90
以下是非递归的深度优先遍历求联通分量的代码示例:
```
#include <iostream>
#include <stack>
#include <vector>
using namespace std;
const int N = 100;
int n;
int g[N][N]; // 图的邻接矩阵
bool st[N]; // 标记数组,记录每个点是否已经访问过
// 深度优先遍历
void dfs(int u, vector<int>& comp) {
st[u] = true; // 标记该点已经访问过
comp.push_back(u); // 将该点加入当前联通分量
for (int i = 0; i < n; i++) {
if (g[u][i] && !st[i]) { // 如果点i与u相连且i未被访问过
dfs(i, comp);
}
}
}
// 求所有联通分量
vector<vector<int>> getComps() {
vector<vector<int>> res; // 存储所有联通分量的vector
for (int i = 0; i < n; i++) { // 枚举每个点
if (!st[i]) { // 如果该点未被访问过,则以该点为起点进行dfs
vector<int> comp; // 存储当前联通分量的vector
dfs(i, comp);
res.push_back(comp);
}
}
return res;
}
int main() {
n = 6;
g[0][1] = g[1][0] = 1;
g[0][2] = g[2][0] = 1;
g[1][2] = g[2][1] = 1;
g[3][4] = g[4][3] = 1;
vector<vector<int>> res = getComps();
for (vector<int>& comp : res) {
for (int x : comp) {
cout << x << " ";
}
cout << endl;
}
return 0;
}
```
该代码支持非递归的方式进行深度优先遍历,求解无向图的所有联通分量。在访问过一个点之后,将该点标记为已访问,并将该点加入当前联通分量中,递归地访问该点的所有未被访问过的邻居。最后,将所有新发现的联通分量加入结果中。
阅读全文