用c语言编 一个关系的传递闭包

Python019

用c语言编 一个关系的传递闭包,第1张

说明:以关系矩阵形式计算传递闭包: #include"stdio.h" #define N 1000 main() { int i,j,a[N][N],b[N][N],c[N][N],s=0,k,e[N][N],m,nprintf("请输入你的关系矩阵的阶n(n<=1000):\n")scanf("%d",&n)printf("请输入你的关系矩阵:\n")for(i=0i<ni++) for(j=0j<nj++) { scanf("%d",&a[i][j])e[i][j]=a[i][j]b[i][j]=a[i][j]} for(m=1m<nm++) { for(i=0i<ni++) for(j=0j<nj++) { for(s=0,k=0k<nk++) s+=b[i][k]*a[k][j]c[i][j]=sif(e[i][j]==0&&c[i][j]!=0) e[i][j]=c[i][j]} for(i=0i<ni++) for(j=0j<nj++) b[i][j]=c[i][j]} for(i=0i<ni++) for(j=0j<nj++) if(e[i][j]!=0) printf("<%d,%d>,",i+1,j+1)printf("\n")}

#include <stdio.h>#include <stdlib.h>#define N 20#define M 20main(){ int i,j,k,m,nint r1[M],r2[M],a[N],mr[N][N]={0}FILE * fpprintf("程序自动调用c:/stone2.txt文件内相应数据\n")fp=fopen("c:\\stone2.txt","r")fscanf(fp,"%d",&n); /*读取集合元素个数*/ for(i=0i<ni++) /*读取集合元素*/ fscanf(fp,"%d",&a[i])fscanf(fp,"%d",&m); /*读取关系个数*/ for(k=0k<mk++) fscanf(fp,"%d,%d",&r1[k],&r2[k]); /*读取关系*/ fclose(fp)printf("自反闭包r(R):\n{")for(i=0i<ni++) printf("<%d,%d>,",a[i],a[i]); /*输出自反闭包*/ for(k=0k<mk++) { if(r1[k]!=r2[k]) printf("<%d,%d>,",r1[k],r2[k])else continue} printf("\b}\n")printf("对称闭包s(R):\n{"); /*输出对称闭包*/ for(k=0k<mk++) { 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=0for(i=0i<n,k<mi++) { if(r1[k]!=a[i]) continueelse { for(j=0j<n,k<mj++) /*关系转换成矩阵*/ { if(r2[k]!=a[j]) continueelse { mr[i][j]=1k++i=0j=0break} } } } printf("关系所对应的关系矩阵:\n")for(i=0i<ni++) { /*打印关系矩阵*/ for(j=0j<nj++) printf("%5d",mr[i][j])printf("\n")} for(k=0k<nk++) for(i=0i<ni++) /*warshall*/ for(j=0j<nj++) mr[i][j]+=mr[i][j]+mr[i][k]*mr[k][j]for(i=0i<ni++) for(j=0j<nj++) { /*把mr[]非0项赋值为1*/ if(!mr[i][j]) continueelse mr[i][j]=1} printf("传递闭包对应关系矩阵:\n")for(i=0i<ni++) { /*输出传递闭包对应的关系矩阵*/ for(j=0j<nj++) printf("%5d",mr[i][j])printf("\n")} system("PAUSE");}自己写的,三个闭包都有,包括传递闭包,看注释就知道了,还是用文件读写,方便数据输入