用c语言编写程序,实现动态输入一个简单有向图的邻接矩阵,分别输出该有向图的强分图,单侧分图和r
时间: 2024-03-18 13:38:54 浏览: 58
请注意,这道题目与你之前提出的问题有所不同。这里需要输出强分图、单侧分图和弱分图的邻接矩阵,而不是分别输出它们的连通分量。下面是我的回答:
```c
#include <stdio.h>
#define MAX_VERTEX_NUM 100 // 最大顶点数
typedef int AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵类型
void input_graph(AdjMatrix G, int n) {
printf("请输入邻接矩阵:\n");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &G[i][j]);
}
}
}
void output_graph(AdjMatrix G, int n) {
printf("邻接矩阵为:\n");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("%d ", G[i][j]);
}
printf("\n");
}
}
void strong_graph(AdjMatrix G, AdjMatrix S, int n) {
// 将邻接矩阵 G 复制到 S 中
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
S[i][j] = G[i][j];
}
}
// 通过 Warshall 算法计算强连通闭包
for (int k = 0; k < n; k++) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
S[i][j] |= (S[i][k] & S[k][j]);
}
}
}
printf("强分图的邻接矩阵为:\n");
output_graph(S, n);
}
void one_side_graph(AdjMatrix G, AdjMatrix S, int n) {
// 执行一次 Warshall 算法
for (int k = 0; k < n; k++) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
S[i][j] |= (S[i][k] & S[k][j]);
}
}
}
// 遍历邻接矩阵,将不在同一个单侧连通分量中的边删除
for (int i = 0; i < n - 1; i++) {
for (int j = i + 1; j < n; j++) {
if (S[i][j] && !S[j][i]) {
S[i][j] = 0;
} else if (S[j][i] && !S[i][j]) {
S[j][i] = 0;
}
}
}
printf("单侧分图的邻接矩阵为:\n");
output_graph(S, n);
}
void weak_graph(AdjMatrix G, AdjMatrix S, int n) {
// 将邻接矩阵 G 复制到 S 中
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
S[i][j] = G[i][j];
}
}
// 通过 Warshall 算法计算传递闭包
for (int k = 0; k < n; k++) {
for (int i = 0; i < n; i++) {
if (S[i][k]) {
for (int j = 0; j < n; j++) {
S[i][j] |= S[k][j];
}
}
}
}
printf("弱分图的邻接矩阵为:\n");
output_graph(S, n);
}
int main() {
int n;
AdjMatrix G, S;
printf("请输入顶点数:");
scanf("%d", &n);
input_graph(G, n);
output_graph(G, n);
strong_graph(G, S, n);
one_side_graph(G, S, n);
weak_graph(G, S, n);
return 0;
}
```
程序中,我们定义了邻接矩阵类型 `AdjMatrix`,并实现了输入和输出邻接矩阵的函数。`strong_graph` 函数计算强分图的邻接矩阵,并输出结果;`one_side_graph` 函数计算单侧分图的邻接矩阵,并输出结果;`weak_graph` 函数计算弱分图的邻接矩阵,并输出结果。程序中使用 Warshall 算法计算强连通闭包和传递闭包。
阅读全文