1.题目描述
给定一张点数为 n 的有向图的邻接矩阵,图中不包含自环,求该有向图的传递闭包。张图的邻接矩阵定义为一个n xn 的矩阵 A =(aij)nx”,其中(1,i到j存在直接连边aii0,i到j没有直接连边张图的传递闭包定义为一个„ xn的矩阵 B =(bij)nx”,其中
(1,i可以直接或间接到达’6=0,i无法直接或间接到达j
1.题目:
2.输入格式
输入数据共几+1行。
第一行一个正整数 n。
第 2 到n +1行每行几个整数,第i+1行第j列的整数为 aij。
3.输出格式
输出数据共 n 行。
第1到n 行每行几 个整数,第讠行第j列的整数为 bij。
4.输入输出样例
1.输入1:
4
0 0 0 1
1 0 0 0
0 0 0 1
0 1 0 0
2.输出1:
1 1 0 1
1 1 0 1
1 1 0 1
1 1 0 1
5.说明/提示
对于 100% 的数据,1 ≤n≤ 100,保证 aij€ {0,1}且 aii = 0。
4.代码:
#include <stdio.h>
#define MAX_N 100
int main() {
int n;
int A[MAX_N][MAX_N];
int B[MAX_N][MAX_N];
// 输入邻接矩阵的点数
scanf("%d", &n);
// 输入邻接矩阵
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &A[i][j]);
B[i][j] = A[i][j]; // 初始化B为A
}
}
// Floyd-Warshall算法计算传递闭包
for (int k = 0; k < n; k++) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (B[i][k] && B[k][j]) {
B[i][j] = 1; // 如果i到k和k到j都有路径,可以达到i到j
}
}
}
}
// 输出传递闭包结果
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("%d ", B[i][j]);
}
printf("\n");
}
return 0;
}