实现代码:图的遍历 实现对连通无向图的深度优先和广度优先遍历算法。 要求: (1)输入图的顶点和边的信息; (2)按用户指定的顶点开始遍历,深度优先遍历图中所有顶点,并输出顶点; (3)按用户指定的顶点开始遍历,广度优先遍历、输出各顶点。
时间: 2024-03-03 20:48:36 浏览: 60
以下是C++实现的图的深度优先遍历和广度优先遍历算法,代码中使用邻接表表示图:
```cpp
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
const int MAXN = 100; // 最大顶点数
const int INF = 0x3f3f3f3f; // 无穷大
// 邻接表存储图
struct Edge {
int to, weight;
Edge(int t, int w): to(t), weight(w) {}
};
vector<Edge> adj[MAXN]; // 邻接表
bool visited[MAXN]; // 标记顶点是否访问过
// 深度优先遍历
void dfs(int u) {
visited[u] = true;
cout << u << " ";
for (int i = 0; i < adj[u].size(); i++) {
int v = adj[u][i].to;
if (!visited[v]) {
dfs(v);
}
}
}
// 广度优先遍历
void bfs(int u) {
queue<int> q;
q.push(u);
visited[u] = true;
while (!q.empty()) {
int u = q.front();
q.pop();
cout << u << " ";
for (int i = 0; i < adj[u].size(); i++) {
int v = adj[u][i].to;
if (!visited[v]) {
q.push(v);
visited[v] = true;
}
}
}
}
int main() {
int n, m;
cin >> n >> m; // 输入顶点数和边数
// 输入边的信息
for (int i = 0; i < m; i++) {
int u, v, w;
cin >> u >> v >> w;
adj[u].push_back(Edge(v, w));
adj[v].push_back(Edge(u, w));
}
// 按用户指定的顶点开始遍历
int u;
cin >> u;
// 深度优先遍历
cout << "DFS: ";
dfs(u);
cout << endl;
// 重置visited数组
memset(visited, false, sizeof(visited));
// 广度优先遍历
cout << "BFS: ";
bfs(u);
cout << endl;
return 0;
}
```
在输入时,每输入一条边就在邻接表中添加两条边,因为是无向图。例如,输入 `(1, 2, 3)` 时,在邻接表中添加 `(1, 2, 3)` 和 `(2, 1, 3)` 两条边。
输入格式:
```
5 7
1 2 2
1 3 3
1 5 4
2 3 1
3 4 5
4 5 1
2 // 指定遍历起点为2
```
输出格式:
```
DFS: 2 1 5 4 3
BFS: 2 1 3 5 4
```
阅读全文