传递闭包矩阵怎么写

1.C语言编写的"求一个关系矩阵的传递闭包"我自己写的 , 绝对可以
#include"stdio.h"
#define N 1000
main()
{
int i,j,a[N][N],b[N][N],c[N][N],s=0,k,e[N][N],m,n;
printf("请输入你的关系矩阵的阶n(n<=1000):\n");
scanf("%d",&n);
printf("请输入你的关系矩阵:\n");
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
e[i][j]=a[i][j];
b[i][j]=a[i][j];
}
for(m=1;m<n;m++)
{
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
for(s=0,k=0;k<n;k++)
s+=b[i][k]*a[k][j];
c[i][j]=s;
if(e[i][j]==0&&c[i][j]!=0)
e[i][j]=c[i][j];
}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
b[i][j]=c[i][j];
}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(e[i][j]!=0)
printf("<%d,%d>,",i+1,j+1);
printf("\n");
}
2.离散数学中传递闭包怎么求 通俗一点方法:warshall法 , 即运行n次 , 每次使得MR[n][i],MR[i][n]都为1时使得MR[i][j]为1 , 否则还是为MR[i][j] 。
传递闭包的计算过程一般可以用Warshell算法描述:
For 每个节点i Do
For 每个节点j Do
If j能到i Then
For 每个节点k Do
a[j, k] := a[j, k] Or ( a[j, i] And a[ i, k] )
其中a数组为布尔数组 , 用来描述两个节点是否相连 , 可以看做一个无权图的邻接矩阵 。算法过程跟Floyd很相似 , 三重循环 , 枚举每个中间节点 。不过传递闭包只需要求出两个节点是否相连 , 而不用求其间的最短路径长 。
传递性:对于一个节点i , 如果j能到i,i能到k , 那么j就能到k 。求传递闭包 , 就是把图中所有满足这样传递性的节点都弄出来 , 计算完成后 , 就知道任意两个节点之间是否相连 。
传递闭包的定义:R'是R(不具有传递性质)变动最少的步骤得到的具有传递性质的关系 。
扩展资料
算法实例:
#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;
}
运行结果:
参考资料:百度百科-传递闭包

传递闭包矩阵怎么写

文章插图