c/c++数据结构:1、创建无向图的存储结构(图的信息由用户输入) 2、输出无向图的信息 3、深度优先遍历(DFS)无向图,并输出遍历序列 4、广度优先遍历(DFS)无向图,并输出遍历序列
时间: 2024-05-13 20:15:37 浏览: 129
以下是用 C++ 实现无向图的存储和遍历的示例代码:
```cpp
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
// 无向图的存储结构
class Graph {
public:
Graph(int V) {
this->V = V;
adj.resize(V);
}
// 添加边
void addEdge(int v, int w) {
adj[v].push_back(w);
adj[w].push_back(v);
}
// 输出图的信息
void printGraph() {
for (int i = 0; i < V; i++) {
cout << i << ": ";
for (int j = 0; j < adj[i].size(); j++) {
cout << adj[i][j] << " ";
}
cout << endl;
}
}
// 深度优先遍历
void DFS(int s) {
vector<bool> visited(V, false);
DFSUtil(s, visited);
}
// 广度优先遍历
void BFS(int s) {
vector<bool> visited(V, false);
queue<int> q;
visited[s] = true;
q.push(s);
while (!q.empty()) {
int u = q.front();
cout << u << " ";
q.pop();
for (int i = 0; i < adj[u].size(); i++) {
int v = adj[u][i];
if (!visited[v]) {
visited[v] = true;
q.push(v);
}
}
}
}
private:
int V;
vector<vector<int>> adj;
// 深度优先遍历的辅助函数
void DFSUtil(int v, vector<bool>& visited) {
visited[v] = true;
cout << v << " ";
for (int i = 0; i < adj[v].size(); i++) {
int u = adj[v][i];
if (!visited[u]) {
DFSUtil(u, visited);
}
}
}
};
int main() {
int V, E;
cout << "请输入无向图的顶点数和边数:" << endl;
cin >> V >> E;
Graph G(V);
cout << "请依次输入每条边的两个端点:" << endl;
for (int i = 0; i < E; i++) {
int v, w;
cin >> v >> w;
G.addEdge(v, w);
}
cout << "无向图的邻接表表示:" << endl;
G.printGraph();
cout << "深度优先遍历序列:" << endl;
G.DFS(0);
cout << endl;
cout << "广度优先遍历序列:" << endl;
G.BFS(0);
cout << endl;
return 0;
}
```
其中,邻接表是通过`vector<vector<int>>`来实现的,其中`adj[i]`表示与顶点`i`相邻的顶点列表。`DFS`和`BFS`分别使用递归和队列来实现遍历,其中`visited`数组用于标记是否已经访问过该顶点。
阅读全文