写在前面
1、基于2021级计算机类实验指导书
2、代码仅提供参考
3、如果代码不满足你的要求,请寻求其他的途径
运行环境
window11家庭版
CLion 2023.2.2
实验要求、源代码和运行结果
1、建立任意无向图,采用邻接矩阵存储,完成以下操作:
(1)对该图进行深度优先遍历,并输出遍历结果;
(2)对该图进行广度优先遍历,并输出遍历结果。
建立的无向图结构如下(示例,数据可修改)
w
/ \
q e
\
r
#include <iostream>
#include <queue>
#include <stack>
#include <vector>
using namespace std;
// 深度优先遍历
void dfs(int node, vector<vector<int>>& graph, vector<bool>& visited) {
cout << node << " ";
visited[node] = true;
for (int i = 0; i < graph.size(); i++) {
if (graph[node][i] && !visited[i]) {
dfs(i, graph, visited);
}
}
}
// 广度优先遍历
void bfs(int node, vector<vector<int>>& graph, vector<bool>& visited) {
queue<int> q;
q.push(node);
visited[node] = true;
while (!q.empty()) {
int currNode = q.front();
q.pop();
cout << currNode << " ";
for (int i = 0; i < graph.size(); i++) {
if (graph[currNode][i] && !visited[i]) {
q.push(i);
visited[i] = true;
}
}
}
}
int main() {
int numNodes; // 图中节点的数量
cout << "请输入图中节点的数量:"<<endl;
cin >> numNodes;
vector<string> nodeNames(numNodes);
cout << "请逐一输入每个节点的名称:" << endl;
for (int i = 0; i < numNodes; i++) {
cout << "节点 " << i + 1 << ":"<<endl;
cin >> nodeNames[i];
}
// 创建邻接矩阵
vector<vector<int>> graph(numNodes, vector<int>(numNodes, 0));
// 输入边的信息
int numEdges; // 图中边的数量
cout << "请输入图中边的数量:"<<endl;
cin >> numEdges;
cout << "请输入每条边的连接关系(使用节点的数字并使用空格分隔,如1 2)"<<endl;
for (int i = 0; i < numEdges; i++) {
cout << "请输入第 " << i + 1 << " 条边的连接关系:"<<endl;
int u, v;
cin >> u >> v;
if (u <= 0 || u > numNodes || v <= 0 || v > numNodes) {
cout << "无效的节点编号!" << endl;
i--;
} else {
graph[u - 1][v - 1] = 1;
graph[v - 1][u - 1] = 1;
}
}
// 输出邻接矩阵
cout << "邻接矩阵:" << endl;
cout << " ";
for (int i = 0; i < numNodes; i++) {
cout << "|" << nodeNames[i] << "| ";
}
cout << endl;
for (int i = 0; i < numNodes; i++) {
cout << "|" << nodeNames[i] << "| ";
for (int j = 0; j < numNodes; j++) {
cout << " " << graph[i][j] << " ";
}
cout << endl;
}
// 深度优先遍历
cout << "深度优先遍历结果:" << endl;
vector<bool> visited(numNodes, false);
dfs(0, graph, visited);
cout << endl;
// 广度优先遍历
cout << "广度优先遍历结果:" << endl;
visited.clear();
visited.resize(numNodes, false);
bfs(0, graph, visited);
cout << endl;
return 0;
}