Warshall算法求传递闭包

2024-11-25 07:30:05
推荐回答(5个)
回答1:

#include
#include
#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 fscanf(fp,"%d",&a[i]);
fscanf(fp,"%d",&m); /*读取关系个数*/
for(k=0;k fscanf(fp,"%d,%d",&r1[k],&r2[k]); /*读取关系*/

fclose(fp);

printf("自反闭包r(R):\n{");
for(i=0;i,",a[i],a[i]); /*输出自反闭包*/
for(k=0;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 {
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 {
if(r1[k]!=a[i]) continue;
else
{
for(j=0;j {
if(r2[k]!=a[j]) continue;
else
{
mr[i][j]=1;
k++; i=0;j=0;
break;
}
}
}
}

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

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

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

system("PAUSE");

}
自己写的,三个闭包都有,包括传递闭包,看注释就知道了,还是用文件读写,方便数据输入

回答2:

#include

#include

#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/*读取集合元素*/
fscanf(fp,"%d",&a[i]);
fscanf(fp,"%d",&m);
/*读取关系个数*/
for(k=0;kfscanf(fp,"%d,%d",&r1[k],&r2[k]);
/*读取关系*/
fclose(fp);
printf("自反闭包r(R):\n{");
for(i=0;iprintf("<%d,%d>,",a[i],a[i]);
/*输出自反闭包*/
for(k=0;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{
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{
if(r1[k]!=a[i])
continue;
else
{
for(j=0;j/*关系转换成矩阵*/
{
if(r2[k]!=a[j])
continue;
else
{
mr[i][j]=1;
k++;
i=0;j=0;
break;
}
}
}
}
printf("关系所对应的关系矩阵:\n");
for(i=0;i{
/*打印关系矩阵*/
for(j=0;jprintf("%5d",mr[i][j]);
printf("\n");
}
for(k=0;kfor(i=0;i/*warshall*/
for(j=0;jmr[i][j]+=mr[i][j]+mr[i][k]*mr[k][j];
for(i=0;ifor(j=0;j{
/*把mr[]非0项赋值为1*/
if(!mr[i][j])
continue;
else
mr[i][j]=1;
}
printf("传递闭包对应关系矩阵:\n");
for(i=0;i{
/*输出传递闭包对应的关系矩阵*/
for(j=0;jprintf("%5d",mr[i][j]);
printf("\n");
}
system("PAUSE");
}
自己写的,三个闭包都有,包括传递闭包,看注释就知道了,还是用文件读写,方便数据输入

回答3:

音译:我和我的小伙伴都惊呆了
war-我
her-和
world-我的
shall-小
hole-伙
ban-伴
doll-都
jean-惊
daily-呆了
连起来就可以读成我和我的小伙伴都惊呆了

回答4:

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

回答5:

莫非南大计算机系的。。。