warshall算法

    xiaoxiao2023-10-05  153

    warshall算法

    warshall算法介绍

    Warshall在1962年提出了一个求关系的传递闭包的有效算法。其具体过程如下,设在n个元素的有限集上关系R的关系矩阵为M: (1)置新矩阵A=M; (2)置i=1; (3)对所有j如果A[j,i]=1,则对k=1…n执行: A[j,k]=A[j,k]∨A[i,k]; (4)i加1; (5)如果i≤n,则转到步骤(3),否则停止。 所得的矩阵A即为关系R的传递闭包t®的关系矩阵。

    举个小例子

    输入矩阵M 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0输出传递闭包 1 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

    来看看warshall算法具体的代码实现(C语言)

    #include<string.h> #include<stdio.h> int M[10][10]; int main(){ freopen("in.txt","r",stdin);//文件输入 // freopen("out","w",stdout);//文件输出 void jiexijuzheng(int n); memset(M,0,sizeof(M)); int a1,i,j; printf("输入个数:\n"); scanf("%d",&a1); printf("输入矩阵 :\n"); for(i=0;i<a1;i++) //输入矩阵 for(j=0;j<a1;j++) { scanf("%d",&M[i][j]); } jiexijuzheng(a1); printf("传递闭包:\n"); for(i=0;i<a1;i++){ for(j=0;j<a1;j++){ printf("-",M[i][j]);} printf("\n"); } return 0; } void jiexijuzheng(int n){ int i,j,k; for(i=0;i<n;i++){ //warshall算法的核心代码部分 for(j=0;j<n;j++){ if(M[j][i]>=1){ for(k=0;k<n;k++){ M[j][k]=M[j][k]+M[i][k]; } } } } for(i=0;i<n;i++){ for(j=0;j<n;j++){ if(M[i][j]>1)M[i][j]=1; }} }

    总结

    总的来讲这个warshall算法还是挺好实现的,算法翻译没啥障碍

    最新回复(0)