用c语言写据Warshall算法的思想,编程实现求给定n个结点的图G的邻接矩阵A,得 到G的可达矩阵P。 输入说明:先输入图G的结点个数,然后依次输入图G的邻接矩阵A的每个元素。 输出说明:输出图G的可达矩阵d。 输入样例: 5 0 1 0 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 1 1 0 1 0 0 输出样例: 图G的可达矩阵d为: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 输入方式:控制台。 判定规则:忽略首尾空白、忽略空行、忽略大小写、数据之间只保留一个空白。 数据文件:“样例.zip” 问题提示: Warshall算法思想的步骤: (1)将图G的邻接矩阵送入P(n,n)中。 (2)1 i。 (3)1 j。 (4)对于k=1,2,…,n,作:Pjk∨(Pji∧Pik) Pjk (5)j+1 j,若j n,则转(4)。 (6)i+1 i,若i n,则转(3),否则结束。
时间: 2024-03-22 08:37:29 浏览: 79
以下是使用C语言实现Warshall算法的代码,实现求给定n个结点的图G的邻接矩阵A,得到G的可达矩阵P:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXN 100
void Warshall(int n, int A[MAXN][MAXN], int P[MAXN][MAXN]);
int main()
{
int n, A[MAXN][MAXN], P[MAXN][MAXN];
// 输入图G的结点个数n
scanf("%d", &n);
// 输入图G的邻接矩阵A的每个元素
int i, j;
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
scanf("%d", &A[i][j]);
}
}
// 调用Warshall算法求可达矩阵P
Warshall(n, A, P);
// 输出可达矩阵P
printf("图G的可达矩阵P为:\n");
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
printf("%d ", P[i][j]);
}
printf("\n");
}
return 0;
}
// Warshall算法求可达矩阵P
void Warshall(int n, int A[MAXN][MAXN], int P[MAXN][MAXN])
{
int i, j, k;
// 将图G的邻接矩阵送入P(n,n)中
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
P[i][j] = A[i][j];
}
}
// 对于k=1,2,...,n,作:Pjk∨(Pji∧Pik)
for (k = 0; k < n; k++) {
for (j = 0; j < n; j++) {
for (i = 0; i < n; i++) {
P[i][j] = P[i][j] || (P[i][k] && P[k][j]);
}
}
}
}
```
使用样例输入,得到的输出为:
```
图G的可达矩阵P为:
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
```
其中,`MAXN` 定义了邻接矩阵的最大大小。
阅读全文