手动输入节点和边,程序使用c++语言
时间: 2024-03-23 16:40:02 浏览: 20
好的,那我先帮您构造这个无向图的邻接表,然后再输出深度优先遍历和广度优先遍历结果。假设这个无向图有6个节点和7条边,那么邻接表可以这样构建:
```c++
#include <iostream>
#include <vector>
using namespace std;
// 定义无向图的邻接表结构体
struct Graph {
int nodeNum; // 节点数
vector<vector<int>> adj; // 邻接表
};
// 构造无向图的邻接表
Graph buildGraph() {
Graph graph;
graph.nodeNum = 6;
graph.adj.resize(graph.nodeNum + 1); // 邻接表从1开始编号
// 手动输入边的信息
graph.adj[1].push_back(2);
graph.adj[1].push_back(3);
graph.adj[2].push_back(1);
graph.adj[2].push_back(3);
graph.adj[2].push_back(4);
graph.adj[2].push_back(5);
graph.adj[3].push_back(1);
graph.adj[3].push_back(2);
graph.adj[3].push_back(4);
graph.adj[4].push_back(2);
graph.adj[4].push_back(3);
graph.adj[4].push_back(5);
graph.adj[5].push_back(2);
graph.adj[5].push_back(4);
graph.adj[6].push_back(5);
return graph;
}
```
这个邻接表的意思是:第一个节点有连向第二个和第三个节点的边,第二个节点有连向第一个、第三个、第四个和第五个节点的边,以此类推。节点和边的编号都从1开始。
接下来是深度优先遍历和广度优先遍历的代码实现。
```c++
#include <iostream>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
// 定义无向图的邻接表结构体
struct Graph {
int nodeNum; // 节点数
vector<vector<int>> adj; // 邻接表
};
// 构造无向图的邻接表
Graph buildGraph() {
Graph graph;
graph.nodeNum = 6;
graph.adj.resize(graph.nodeNum + 1); // 邻接表从1开始编号
// 手动输入边的信息
graph.adj[1].push_back(2);
graph.adj[1].push_back(3);
graph.adj[2].push_back(1);
graph.adj[2].push_back(3);
graph.adj[2].push_back(4);
graph.adj[2].push_back(5);
graph.adj[3].push_back(1);
graph.adj[3].push_back(2);
graph.adj[3].push_back(4);
graph.adj[4].push_back(2);
graph.adj[4].push_back(3);
graph.adj[4].push_back(5);
graph.adj[5].push_back(2);
graph.adj[5].push_back(4);
graph.adj[6].push_back(5);
return graph;
}
// 深度优先遍历
void DFS(Graph graph, int s, vector<bool>& visited) {
visited[s] = true;
cout << s << " ";
for (int i = 0; i < graph.adj[s].size(); i++) {
int v = graph.adj[s][i];
if (!visited[v]) {
DFS(graph, v, visited);
}
}
}
// 广度优先遍历
void BFS(Graph graph, int s, vector<bool>& visited) {
queue<int> q;
q.push(s);
visited[s] = true;
while (!q.empty()) {
int u = q.front();
q.pop();
cout << u << " ";
for (int i = 0; i < graph.adj[u].size(); i++) {
int v = graph.adj[u][i];
if (!visited[v]) {
visited[v] = true;
q.push(v);
}
}
}
}
int main() {
Graph graph = buildGraph();
// 深度优先遍历
vector<bool> visited(graph.nodeNum + 1, false); // 初始化所有节点都没有被访问
cout << "深度优先遍历结果:";
for (int i = 1; i <= graph.nodeNum; i++) {
if (!visited[i]) {
DFS(graph, i, visited);
}
}
cout << endl;
// 广度优先遍历
visited.assign(graph.nodeNum + 1, false); // 重置所有节点都没有被访问
cout << "广度优先遍历结果:";
for (int i = 1; i <= graph.nodeNum; i++) {
if (!visited[i]) {
BFS(graph, i, visited);
}
}
cout << endl;
return 0;
}
```
这个代码中,使用了深度优先遍历和广度优先遍历两种方式对无向图进行遍历,并输出遍历结果。其中,DFS函数是深度优先遍历的实现,BFS函数是广度优先遍历的实现。visited是一个布尔型数组,用于记录每个节点是否被访问过。