Warshall算法求传递闭包

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Warshall算法求传递闭包相关的知识,希望对你有一定的参考价值。

输入一个关系的关系矩阵,计算其传递闭包,使用Warshall算法。
输出传递闭包所对应的关系矩阵,c语言实现

#include <stdio.h>
#include <stdlib.h>
#define N 20
#define M 20

main()

int i,j,k,m,n;
int r1[M],r2[M],a[N],mr[N][N]=0;

FILE * fp;
printf("程序自动调用c:/stone2.txt文件内相应数据\n");
fp=fopen("c:\\stone2.txt","r");
fscanf(fp,"%d",&n); /*读取集合元素个数*/
for(i=0;i<n;i++) /*读取集合元素*/
fscanf(fp,"%d",&a[i]);
fscanf(fp,"%d",&m); /*读取关系个数*/
for(k=0;k<m;k++)
fscanf(fp,"%d,%d",&r1[k],&r2[k]); /*读取关系*/

fclose(fp);

printf("自反闭包r(R):\n");
for(i=0;i<n;i++) printf("<%d,%d>,",a[i],a[i]); /*输出自反闭包*/
for(k=0;k<m;k++)

if(r1[k]!=r2[k]) printf("<%d,%d>,",r1[k],r2[k]);
else continue;

printf("\b\n");

printf("对称闭包s(R):\n"); /*输出对称闭包*/
for(k=0;k<m;k++)

if(r1[k]!=r2[k]) printf("<%d,%d>,<%d,%d>,",r1[k],r2[k],r2[k],r1[k]);
else printf("<%d,%d>,",r1[k],r2[k]);

printf("\b\n");

k=0;
for(i=0;i<n,k<m;i++)

if(r1[k]!=a[i]) continue;
else

for(j=0;j<n,k<m;j++) /*关系转换成矩阵*/

if(r2[k]!=a[j]) continue;
else

mr[i][j]=1;
k++; i=0;j=0;
break;





printf("关系所对应的关系矩阵:\n");
for(i=0;i<n;i++)
/*打印关系矩阵*/
for(j=0;j<n;j++)
printf("%5d",mr[i][j]);
printf("\n");

for(k=0;k<n;k++)
for(i=0;i<n;i++) /*warshall*/
for(j=0;j<n;j++)
mr[i][j]+=mr[i][j]+mr[i][k]*mr[k][j];

for(i=0;i<n;i++)
for(j=0;j<n;j++)
/*把mr[]非0项赋值为1*/
if(!mr[i][j]) continue;
else mr[i][j]=1;


printf("传递闭包对应关系矩阵:\n");
for(i=0;i<n;i++)
/*输出传递闭包对应的关系矩阵*/
for(j=0;j<n;j++)
printf("%5d",mr[i][j]);
printf("\n");


system("PAUSE");


自己写的,三个闭包都有,包括传递闭包,看注释就知道了,还是用文件读写,方便数据输入
参考技术A #include
<stdio.h>
#include
<stdlib.h>
#define
N
20
#define
M
20
main()

int
i,j,k,m,n;
int
r1[M],r2[M],a[N],mr[N][N]=0;
FILE
*
fp;
printf("程序自动调用c:/stone2.txt文件内相应数据\n");
fp=fopen("c:\\stone2.txt","r");
fscanf(fp,"%d",&n);
/*读取集合元素个数*/
for(i=0;i<n;i++)
/*读取集合元素*/
fscanf(fp,"%d",&a[i]);
fscanf(fp,"%d",&m);
/*读取关系个数*/
for(k=0;k<m;k++)
fscanf(fp,"%d,%d",&r1[k],&r2[k]);
/*读取关系*/
fclose(fp);
printf("自反闭包r(R):\n");
for(i=0;i<n;i++)
printf("<%d,%d>,",a[i],a[i]);
/*输出自反闭包*/
for(k=0;k<m;k++)

if(r1[k]!=r2[k])
printf("<%d,%d>,",r1[k],r2[k]);
else
continue;

printf("\b\n");
printf("对称闭包s(R):\n");
/*输出对称闭包*/
for(k=0;k<m;k++)

if(r1[k]!=r2[k])
printf("<%d,%d>,<%d,%d>,",r1[k],r2[k],r2[k],r1[k]);
else
printf("<%d,%d>,",r1[k],r2[k]);

printf("\b\n");
k=0;
for(i=0;i<n,k<m;i++)

if(r1[k]!=a[i])
continue;
else

for(j=0;j<n,k<m;j++)
/*关系转换成矩阵*/

if(r2[k]!=a[j])
continue;
else

mr[i][j]=1;
k++;
i=0;j=0;
break;




printf("关系所对应的关系矩阵:\n");
for(i=0;i<n;i++)

/*打印关系矩阵*/
for(j=0;j<n;j++)
printf("%5d",mr[i][j]);
printf("\n");

for(k=0;k<n;k++)
for(i=0;i<n;i++)
/*warshall*/
for(j=0;j<n;j++)
mr[i][j]+=mr[i][j]+mr[i][k]*mr[k][j];
for(i=0;i<n;i++)
for(j=0;j<n;j++)

/*把mr[]非0项赋值为1*/
if(!mr[i][j])
continue;
else
mr[i][j]=1;

printf("传递闭包对应关系矩阵:\n");
for(i=0;i<n;i++)

/*输出传递闭包对应的关系矩阵*/
for(j=0;j<n;j++)
printf("%5d",mr[i][j]);
printf("\n");

system("PAUSE");

自己写的,三个闭包都有,包括传递闭包,看注释就知道了,还是用文件读写,方便数据输入
参考技术B 音译:我和我的小伙伴都惊呆了
war-我
her-和
world-我的
shall-小
hole-伙
ban-伴
doll-都
jean-惊
daily-呆了
连起来就可以读成我和我的小伙伴都惊呆了
参考技术C for (int k = 0; k < N; ++k)
for (int i = 0; i < N; ++i)
for (int j = 0; j < N; ++j)
if(graph[i][k] && graph[k][j])
graph[i][j] = true;



参考技术D 莫非南大计算机系的。。。

Warshall算法求传递闭包,Python语言~

输入一个关系的关系矩阵,计算其传递闭包,使用Warshall算法,
输出传递闭包所对应的关系矩阵,Python语言实现

高手不吝赐教~~

有满意的答案我会补分。

快纠结死我了,电脑盲,唉。

def __warshall(self, a):
assert (len(row) == len(a) for row in a)
n = len(a)
#请在下面编程实现Roy-Warshall求传递闭包的算法
#参数a:为一个关系矩阵
# 请删除pass后编程实现该方法功能
for i in range(n) :
for j in range(n):
if a[j][i] == 1:
for k in range(n):
a[j][k] = a[j][k] | a[i][k]
# 请在上面编写程序,不要修改下面代码
return a
参考技术A 完了我数学都快忘光了。不然还能帮帮,,

以上是关于Warshall算法求传递闭包的主要内容,如果未能解决你的问题,请参考以下文章

Warshall算法求传递闭包及Python编程的实现

1.利用求传递闭包的Warshall算法,给定关系R,编写求R的可传递闭包的C语言程序并利用下列数据测试。

求传递闭包的warshall算法

Warshall算法求传递闭包

如何使用 Warshall 的传递闭包算法来确定规范的 LR(1) 解析器闭包?

warshall算法