传递闭包的warshall算法

来源:互联网 发布:excel 数据截断 编辑:程序博客网 时间:2024/05/16 10:15

#include<stdio.h>#define MATRIX_SIZE 5void Warshall_Algorithm(int matrix[][MATRIX_SIZE],int N);int main(){ int warshall[MATRIX_SIZE][MATRIX_SIZE]={0,1,0,0,1,0,1,0,1,1,0,0,0,0,1,0,0,0,1,0,0,1,0,1,0}; /*以下部分是自己输入关系矩阵 的值,但是其值仅限于0 or1  for(int i=0;i<MATRIX_SIZE;tt++){         printf("please input %dth row's digits\n",i);         for(int j=0;j<MATRIX_SIZE;pp++)                 scanf("%d",&warshall[i][j]);}*/Warshall_Algorithm(warshall,MATRIX_SIZE);                    for(int tt=0;tt<MATRIX_SIZE;tt++){         printf("\n");         for(int pp=0;pp<MATRIX_SIZE;pp++)                 printf("  %d  ",warshall[tt][pp]);}                 getchar();                 }void Warshall_Algorithm(int matrix[][MATRIX_SIZE],int N){ for(int i=0;i<N;i++)         for(int j=0;j<N;j++){                 if(matrix[i][j]==1){                            for(int k=0;k<N;k++){                                    if(matrix[j][k]==1)                                              matrix[i][k]=1;}}}     }








原理部分是网上找的太懒了呵呵:

来自于:http://cs.bnu.edu.cn/~fxshen/discrete_math/teach%20content4.8.htm

Warshall算法

计算关系R的传递闭包的算法。

 

设A={ a1,a2,……,an},R是A上关系。定义矩阵WK=[tij]如下:tij=1当且仅当从ai到aj有一条路径,经过的顶点在{a1,a2,…,ak}之中。 

W0=MR.Wn= MR.

设已有Wk-1=[sij],计算WK=[tij]:

  tij=1

  当且仅当

(1) sij=1  

  //ai到aj有路径中间点在

   {a1,a2,…,ak-1}之中。

(2) sik=1且skj=1.

  //ai到aj有路径经过ak,其余中间

    点在{a1,a2,…,ak-1}之中。

 

Wk-1的元素a1k乘ak1加到a11

   元素a1k乘ak2加到a12

    ……

   元素a1k乘akn加到a1n

 

   元素a2k乘ak1加到a21

   元素a2k乘ak2加到a22

   ……

   元素a2k乘akn加到a2n

   ……

   ……

   元素ank乘ak1加到an1

   元素ank乘ak2加到an2

   ……

   元素ank乘akn加到ann

 

Wk-1第k列的元素遍乘第k行的元素加到矩阵Wk-1

Algorithm Warshall

1. Closure←Mat

2. ForK=1 Thro N

   a.For I=1 Thro N

      1.For J=1 Thro N

         a.Closure[I,J]←Closure[I,J]∨Closure[I,K]∧ Closure[K,J]。

End of AlgorithmWarshall

 

例2. W0=MR=

k=1,第1列的元素遍乘第1行的元素加到W0

W1=

k=2,第2列的元素遍乘第2行的元素加到W1

W2=

k=3,第3列的元素遍乘第3行的元素加到W2

W3=

k=4,第4列的元素遍乘第4行的元素

加到W3,第4行的元素全0。

W4= W3

MR=W3.

原创粉丝点击