什么意思 可以用c++代码来给我解释一下邻接矩阵和图的关系吗
时间: 2024-02-20 14:01:30 浏览: 96
图的邻接矩阵C/C++
当然可以,以下是一个简单的 C++ 代码示例,用于生成一个无向图并输出其邻接矩阵:
```c++
#include <iostream>
#include <vector>
using namespace std;
const int MAXN = 100; // 最大顶点数量
int n, m; // n 表示顶点数,m 表示边数
vector<int> adj[MAXN + 1]; // 邻接表
int mat[MAXN + 1][MAXN + 1]; // 邻接矩阵
int main() {
cin >> n >> m;
// 读入边
for (int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
// 无向图,需要添加两个方向的边
adj[u].push_back(v);
adj[v].push_back(u);
}
// 构建邻接矩阵
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
mat[i][j] = 0;
}
for (int j = 0; j < adj[i].size(); j++) {
int v = adj[i][j];
mat[i][v] = 1;
}
}
// 输出邻接矩阵
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cout << mat[i][j] << " ";
}
cout << endl;
}
return 0;
}
```
该代码通过邻接表表示图的边,然后通过邻接矩阵表示图的结构。图的邻接矩阵是一个 $n\times n$ 的矩阵,其中 $mat_{i,j}=1$ 表示存在一条从顶点 $i$ 到顶点 $j$ 的边,否则 $mat_{i,j}=0$ 表示不存在这样的边。
在该代码中,先通过邻接表表示图的边,邻接表是一个 vector 数组,每个 vector 存储了与该顶点相邻的顶点。然后使用一个 $n\times n$ 的二维数组 mat 表示邻接矩阵,通过遍历邻接表的方式构造邻接矩阵。最后,输出邻接矩阵即可。
需要注意的是,对于无向图来说,邻接矩阵是对称的,因此只需要存储上三角或下三角的元素即可,能够节约一半的空间。而对于有向图来说,邻接矩阵不一定是对称的,因此需要存储全部 $n^2$ 个元素。
阅读全文