传递闭包的定义:
R’是R(不具有传递性质)变动最少的步骤得到的具有传递性质的关系。
方法:warshall法
即运行n次,每次使得MR[n][i],MR[i][n]都为1时使得MR[i][j]为1,否则还是为MR[i][j].
#include<stdio.h>
#define N 10
int judge(int k,int i,int j)
{
if(i==1 && j==1){
return 1;
}
return k;
}
void warShall(int MR[N][N],int n)
{
for(int k=0;k<n;k++){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i!=k || j!=k){
MR[i][j]=judge(MR[i][j],MR[k][j],MR[i][k]);
}
}
}
}
}
int main()
{
int MR[10][10];
int mul;
scanf("%d",&mul);
for(int i=0;i<mul;i++){
for(int j=0;j<mul;j++){
scanf("%d",&MR[i][j]);
}
}
printf("求传递闭包为:\n");
warShall(MR,mul);
for(int i=0;i<mul;i++){
for(int j=0;j<mul;j++){
printf("%d ",MR[i][j]);
}
printf("\n");
}
return 0;
}
运行结果: