用c++实现以下代码 1.采用邻接矩阵或者邻接表创建无向图 2.深度遍历无向图,输出遍历结果 3.广度遍历无向图,输出遍历结果
时间: 2024-12-17 13:31:09 浏览: 56
在C++中,我们可以分别使用邻接矩阵和邻接表这两种数据结构来表示无向图。这里我会给出简单的实现:
**1. 邻接矩阵实现**
```cpp
#include <vector>
using namespace std;
// 定义无向图邻接矩阵
class GraphAdjMatrix {
private:
vector<vector<int>> adj;
int numVertices;
public:
GraphAdjMatrix(int vertices) : numVertices(vertices) { adj.resize(numVertices, vector<int>(numVertices)); }
void addEdge(int src, int dest) {
adj[src][dest] = 1; // 如果无向图,则无需加反向边
adj[dest][src] = 1;
}
void depthFirstSearch(int start) {
bool visited[numVertices];
dfsUtil(start, visited);
// 输出深度优先遍历结果
for (int i = 0; i < numVertices; ++i)
if (visited[i])
cout << i << " ";
}
private:
void dfsUtil(int vertex, bool* visited) {
visited[vertex] = true;
cout << vertex << " "; // 打印节点
for (int i = 0; i < numVertices; ++i)
if (adj[vertex][i] && !visited[i])
dfsUtil(i, visited);
}
};
// 使用示例
int main() {
GraphAdjMatrix g(5); // 创建一个包含5个顶点的图
g.addEdge(0, 1); g.addEdge(0, 4); g.addEdge(1, 2); g.addEdge(2, 3); g.addEdge(3, 4);
g.depthFirstSearch(0); // 深度优先遍历从0开始
return 0;
}
```
**2. 邻接表实现**
```cpp
#include <list>
using namespace std;
// 定义无向图邻接表
class GraphAdjList {
private:
vector<vector<int>> adj;
int numVertices;
public:
GraphAdjList(int vertices) : numVertices(vertices) {}
void addEdge(int src, int dest) {
adj[src].push_back(dest);
adj[dest].push_back(src); // 无向图添加双向边
}
void breadthFirstSearch(int start) {
vector<bool> visited(numVertices, false);
queue<int> q;
visited[start] = true;
q.push(start);
while (!q.empty()) {
int curr = q.front();
q.pop();
cout << curr << " ";
for (int neighbor : adj[curr]) {
if (!visited[neighbor]) {
visited[neighbor] = true;
q.push(neighbor);
}
}
}
// 输出广度优先遍历结果
}
};
// 使用示例同上
```
**
阅读全文