编写C++代码:求下图的的连通分支,要求:需保存所有的来连通分支并打印,采用BFS和DFS两种方法,不用递归
时间: 2024-12-20 17:20:32 浏览: 33
在C++中,我们可以使用深度优先搜索(DFS)和广度优先搜索(BFS)算法来找出给定图中的连通分支。这里我们假设图是一个邻接矩阵或邻接列表表示。下面分别给出BFS和DFS的示例代码:
首先,创建一个简单的邻接矩阵表示图:
```cpp
#include <iostream>
#include <vector>
using namespace std;
// 用于表示节点之间的连接
bool graph[5][5] = {
{0, 1, 1, 1, 0},
{1, 0, 1, 1, 1},
{1, 1, 0, 1, 0},
{1, 1, 1, 0, 1},
{0, 1, 0, 1, 0}
};
// 定义邻接表辅助结构
struct Edge {
int to;
bool visited; // 标记节点是否访问过
};
vector<Edge> adjList[5];
void addEdge(int from, int to) {
adjList[from].push_back({to, false});
}
```
接下来,我们分别实现BFS和DFS来查找连通分支:
**BFS (广度优先搜索)**:
```cpp
void bfsFindConnectedBranches(int start) {
vector<int> visited;
queue<int> q;
visited[start] = true;
q.push(start);
while (!q.empty()) {
int node = q.front();
cout << "Branch found: Node " << node << endl;
for (const auto& edge : adjList[node]) {
if (!visited[edge.to]) {
visited[edge.to] = true;
q.push(edge.to);
}
}
q.pop();
}
}
```
**DFS (深度优先搜索)**:
```cpp
void dfsFindConnectedBranches(int start, vector<bool>& visited) {
visited[start] = true;
cout << "Branch found: Node " << start << endl;
for (const Edge& edge : adjList[start]) {
if (!visited[edge.to]) {
dfsFindConnectedBranches(edge.to, visited);
}
}
}
```
你可以根据需要在主函数中调用上述函数,传入起点(如0)和一个标志数组(对于DFS),来查找所有的连通分支。
```cpp
int main() {
// 初始化邻接列表
for (int i = 0; i < 5; ++i)
for (int j = 0; j < 5; ++j)
if (graph[i][j])
addEdge(i, j);
// 使用BFS查找连通分支
bfsFindConnectedBranches(0);
// 使用DFS查找连通分支
vector<bool> dfsVisited(5, false);
dfsFindConnectedBranches(0, dfsVisited);
return 0;
}
```
阅读全文