C++设计一个基于图的邻接表的图的基本操作的演示程序。 【基本要求】 实现下列六种基本运算:(1)创建图;(2)深度优先遍历图;(3)广度优先遍历图
时间: 2024-12-13 15:24:53 浏览: 11
在C++中,我们可以使用邻接表作为图的数据结构,因为它可以节省空间,并且对于稀疏图来说更高效。下面是一个简单的邻接表图的实现以及其基本操作的演示:
```cpp
#include <iostream>
#include <vector>
#include <stack>
// 定义节点
struct Node {
int value;
std::vector<int> adjacents; // 邻接列表
};
// 创建一个无向图
Node* createGraph(int vertices) {
Node* graph = new Node[vertices];
for (int i = 0; i < vertices; ++i)
graph[i].adjacents.clear();
return graph;
}
// 添加边到图中
void addEdge(Node* graph, int src, int dest) {
graph[src].adjacents.push_back(dest);
// 对于无向图,需要添加反向边
graph[dest].adjacents.push_back(src);
}
// 深度优先搜索
void dfs(Node* graph, int start, bool visited[]) {
visited[start] = true;
std::cout << "Visiting node: " << start << "\n";
for (int i : graph[start].adjacents)
if (!visited[i])
dfs(graph, i, visited);
}
// 广度优先搜索
void bfs(Node* graph, int start) {
std::queue<Node*> queue;
bool visited[vertex_count] = {false};
queue.push(&graph[start]);
visited[start] = true;
while (!queue.empty()) {
Node* current = queue.front();
queue.pop();
std::cout << "Visiting node: " << current->value << "\n";
for (int i : current->adjacents)
if (!visited[i])
visited[i] = true,
queue.push(&graph[i]);
}
}
int main() {
int vertices, edges;
std::cout << "Enter number of vertices: ";
std::cin >> vertices;
Node* graph = createGraph(vertices);
std::cout << "Enter number of edges: ";
std::cin >> edges;
for (int i = 0; i < edges; ++i) {
int src, dest;
std::cin >> src >> dest;
addEdge(graph, src, dest);
}
std::cout << "Enter a node to start DFS: ";
int startDfs;
std::cin >> startDfs;
bool visited[vertex_count];
memset(visited, false, sizeof visited);
dfs(graph, startDfs, visited);
std::cout << "Enter a node to start BFS: ";
int startBfs;
std::cin >> startBfs;
bfs(graph, startBfs);
return 0;
}
```
这个程序首先创建了一个无向图,然后允许用户输入边和起点,接着分别执行深度优先搜索(DFS)和广度优先搜索(BFS)。注意,你需要替换`vertex_count`为实际的节点数。
阅读全文