百科知识网

离散数学中传递闭包怎么求通俗一点

发布时间:2025-10-06 | 来源:互联网转载和整理

方法: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

#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;

}

运行结果:

参考资料:百度百科-传递闭包

传递闭包

上一篇:广州沙面岛景点介绍(广州沙面)

下一篇:避雷针怎样安装

其他文章

  • 如何举报高考违规
  • 很污的言情小说大全(言情小说大全污的片段)
  • 莲蓬乳和空心手指(蓬莲乳和空无指)
  • 天娱传媒旗下有哪些艺人
  • 终极一家为什么不能看了
  • 绵阳中学2023高三复读班招生简章
  • 暴殄天物和暴殄天物的区别
  • 自招线什么意思
  • 手机白名单怎么设置
  • 美国国庆放假几天
  • 附近有那些家政公司
  • 《满江红》全文诗词
  • 俩俩仨仨是成语吗
  • 果宝特攻中的人物名字都有谁
  • 东莞哪里有小龙虾批发
  • 袁氏家谱排辈
  • 年立水素杯真的有用吗
  • 汽车保养app排名推荐
  • 桥架人工费多少钱一米
  • 晚霞的寓意和象征