使用C++实现有向图的邻接矩阵,以及可达矩阵的计算算法。
时间: 2024-05-16 19:17:00 浏览: 108
邻接矩阵是一种表示有向图的数据结构,它使用二维数组来表示图中的节点和边。对于有向图而言,邻接矩阵通常是一个 n x n 的矩阵,其中 n 表示图的节点数目,矩阵中的第 i 行第 j 列元素表示从节点 i 到节点 j 是否有一条有向边。如果存在一条从节点 i 到节点 j 的有向边,则邻接矩阵中的第 i 行第 j 列元素为 1,否则为 0。
下面是使用 C++ 实现有向图的邻接矩阵的代码:
```
#include <iostream>
#include <vector>
using namespace std;
const int MAXN = 100; // 最大节点数
int n; // 节点数
int g[MAXN][MAXN]; // 邻接矩阵,g[i][j] 表示从 i 到 j 是否有一条有向边
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> g[i][j];
}
}
return 0;
}
```
可达矩阵是一个 n x n 的矩阵,其中第 i 行第 j 列的元素表示从节点 i 是否可以到达节点 j。如果节点 i 可以到达节点 j,则可达矩阵中的第 i 行第 j 列元素为 1,否则为 0。
下面是使用 C++ 实现有向图的可达矩阵的代码:
```
#include <iostream>
#include <vector>
using namespace std;
const int MAXN = 100; // 最大节点数
int n; // 节点数
int g[MAXN][MAXN]; // 邻接矩阵,g[i][j] 表示从 i 到 j 是否有一条有向边
int reach[MAXN][MAXN]; // 可达矩阵,reach[i][j] 表示从 i 是否可以到达 j
void compute_reach() {
for (int k = 0; k < n; k++) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
reach[i][j] |= g[i][k] && reach[k][j];
}
}
}
}
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> g[i][j];
reach[i][j] = g[i][j]; // 初始化可达矩阵
}
}
compute_reach(); // 计算可达矩阵
return 0;
}
```
上面的代码中,compute_reach 函数用于计算可达矩阵。它采用了 Floyd 算法的思想,即从 i 到 j 的路径可以经过任意一个节点 k,因此只需要枚举所有的 k,判断从 i 到 k 和从 k 到 j 是否有路径,如果都有,则从 i 到 j 也有路径。
阅读全文