#include <iostream> #include <vector> #include <queue> using namespace std; // 定义图的边结构体 struct Edge { int to; // 边的终点 int weight; // 边的权重 Edge(int t, int w) : to(t), weight(w) {} }; // 定义图的邻接表结构体 struct Graph { int n; // 节点数 vector<vector<Edge>> adj; // 邻接表 Graph(int n) : n(n), adj(n) {} // 添加一条边 void addEdge(int from, int to, int weight) { adj[from].push_back(Edge(to, weight)); } // 深度优先遍历 void dfs(int cur, vector<bool>& visited) { visited[cur] = true; cout << cur << " "; for (auto e : adj[cur]) { if (!visited[e.to]) { dfs(e.to, visited); } } } // 广度优先遍历 void bfs(int cur, vector<bool>& visited) { queue<int> q; q.push(cur); visited[cur] = true; while (!q.empty()) { int u = q.front(); q.pop(); cout << u << " "; for (auto e : adj[u]) { if (!visited[e.to]) { visited[e.to] = true; q.push(e.to); } } } } }; int main() { int n, m; cin >> n >> m; Graph g(n); for (int i = 0; i < m; i++) { int u, v, w; cin >> u >> v >> w; g.addEdge(u, v, w); g.addEdge(v, u, w); // 无向图需要添加反向边 } // 深度优先遍历 cout << "DFS: "; vector<bool> visited(n, false); g.dfs(0, visited); cout << endl; // 广度优先遍历 cout << "BFS: "; visited.assign(n, false); g.bfs(0, visited); cout << endl; return 0; }解释该代码的深度优先遍历
时间: 2024-04-26 17:20:21 浏览: 69
#include_iostream.h_
4星 · 用户满意度95%
这段代码实现了一个无向图的深度优先遍历,主要包括以下几个部分:
1. 定义了一个边的结构体 Edge,用来存储边的终点和权重;
2. 定义了一个邻接表结构体 Graph,用来存储整个图的信息,包括节点数、邻接表等;
3. 在 Graph 结构体中,定义了一个 addEdge 函数,用来添加一条边;
4. 在 Graph 结构体中,定义了一个 dfs 函数,用来进行深度优先遍历;
5. 在 main 函数中,首先输入节点数和边数,然后用 addEdge 函数添加所有的边;
6. 最后调用 dfs 函数进行深度优先遍历,并输出遍历结果。
在 dfs 函数中,首先将当前节点标记为已访问,然后输出当前节点的编号。然后遍历当前节点的邻接表,对于每个未访问的邻居,递归调用 dfs 函数进行访问。这样就能够实现整个图的深度优先遍历。
阅读全文