定义图的邻接矩阵存储结构,并编写图的初始化、建立图、输出图、深度优先遍历、计算并输出图中每个顶点的度等基本操作实现两数。给出你将要边写代码的图及代码
时间: 2023-12-19 08:07:58 浏览: 35
为了更好地说明问题,我这里以一个无向图为例,给出相应的代码实现。
1. 定义图的邻接矩阵存储结构:
```c++
#define MAXSIZE 100
int G[MAXSIZE][MAXSIZE]; // 邻接矩阵数组
int V[MAXSIZE]; // 顶点数组
int n; // 图中顶点数
```
2. 初始化图:
```c++
// 初始化图
void init_graph() {
memset(G, 0, sizeof(G)); // 初始化邻接矩阵数组
memset(V, 0, sizeof(V)); // 初始化顶点数组
n = 0; // 初始化顶点数
}
```
3. 建立图:
```c++
// 添加一条边
void add_edge(int u, int v, int w) {
G[u][v] = w;
}
// 建立无向图
void build_graph() {
int m, u, v, w;
cin >> n >> m; // 输入顶点数和边数
for (int i = 0; i < n; i++) {
cin >> V[i]; // 输入顶点的值
}
for (int i = 0; i < m; i++) {
cin >> u >> v >> w; // 输入一条边的两个顶点和权值
add_edge(u, v, w);
add_edge(v, u, w); // 无向图需要添加两条边
}
}
```
4. 输出图:
```c++
// 输出邻接矩阵
void print_graph() {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cout << G[i][j] << " ";
}
cout << endl;
}
}
// 输出顶点数组
void print_vertex() {
for (int i = 0; i < n; i++) {
cout << V[i] << " ";
}
cout << endl;
}
// 输出图
void print() {
cout << "邻接矩阵:" << endl;
print_graph();
cout << "顶点数组:" << endl;
print_vertex();
}
```
5. 深度优先遍历:
```c++
// 深度优先遍历
void dfs(int u, bool* visited) {
visited[u] = true; // 标记顶点 u 已被访问
cout << V[u] << " "; // 输出顶点 u
for (int v = 0; v < n; v++) {
if (G[u][v] && !visited[v]) { // 如果顶点 u 和顶点 v 之间有边且顶点 v 未被访问
dfs(v, visited); // 递归访问顶点 v
}
}
}
// 对图进行深度优先遍历
void dfs_traversal() {
bool visited[MAXSIZE]; // 记录每个顶点是否被访问过
memset(visited, false, sizeof(visited));
for (int u = 0; u < n; u++) {
if (!visited[u]) { // 如果顶点 u 未被访问过
dfs(u, visited); // 从顶点 u 开始深度优先遍历
}
}
cout << endl;
}
```
6. 计算并输出图中每个顶点的度:
```c++
// 计算顶点 u 的度
int degree(int u) {
int deg = 0;
for (int v = 0; v < n; v++) {
if (G[u][v]) { // 如果顶点 u 和顶点 v 之间有边
deg++; // 增加顶点 u 的度
}
}
return deg;
}
// 输出图中每个顶点的度
void print_degree() {
for (int u = 0; u < n; u++) {
cout << "顶点 " << V[u] << " 的度为 " << degree(u) << endl;
}
}
```
最后,我们可以在主函数中依次调用这些函数,实现对图的基本操作:
```c++
int main() {
init_graph(); // 初始化图
build_graph(); // 建立图
print(); // 输出图
dfs_traversal(); // 深度优先遍历
print_degree(); // 输出每个顶点的度
return 0;
}
```