离散数学实验报告姓名:学号:班级:离散数学实验报告实验一真值计算实验内容:从键盘输入两个命题P和Q的真值,求它们的合取、析取、条件和双条件的真值。用C语言实现。实验源程序和运行结果如下:#includeiostream.hvoidmain(){charp,q,t;intp1,q1;cout输入p,q的真值(F或T)endl;cinpq;if(p=='F')p1=0;elsep1=1;if(q=='F')q1=0;elseq1=1;//下面进行为运算if(p1|q1)t='T';elset='F';coutp析取q为tendl;if(p1&q1)t='T';elset='F';coutp和取q为tendl;if((!p1)|q1)t='T';elset='F';coutp条件q为tendl;if(p1==q1)t='T';elset='F';coutp双条件q为tendl;}实验二关系闭包计算实验内容:从键盘输入一个关系的关系矩阵,计算其自反闭包、对称闭包和传递闭包,传递闭包要求使用两种算法,即R+和Warshall算法。用C语言实现。实验源程序运行结果如下:#includestdio.hinthe(int,int);voidmain(){inta[100][100],b[100][100],c[100][100],d[100][100],I[100][100],i,j,k,n,m,p,q,t;printf(请输入关系矩阵的阶数\n);scanf(%d,&n);printf(请输入此关系矩阵\n);for(i=0;in;i++)for(j=0;jn;j++)scanf(%d,&a[i][j]);printf(选择1计算自反闭包...\n选择2计算对称闭包...\n选择3用R+计算传递闭包...\n选择4用washall计算传递闭包...\n计算结束后选择0退出\n);scanf(%d,&t);switch(t){case1:{for(i=0;in;i++){for(j=0;jn;j++){if(i==j)I[i][j]=1;elseI[i][j]=0;}}for(i=0;in;i++){for(j=0;jn;j++)b[i][j]=he(a[i][j],I[i][j]),printf(%4d,b[i][j]);printf(\n);}};break;case2:{for(i=0;in;i++){for(j=0;jn;j++)b[j][i]=a[i][j];}printf(对称闭包矩阵为\n);for(i=0;in;i++){for(j=0;jn;j++)c[i][j]=he(a[i][j],b[i][j]),printf(%4d,c[i][j]);printf(\n);}};break;case3:{for(i=0;in;i++)for(j=0;jn;j++){c[i][j]=a[i][j];d[i][j]=a[i][j];b[i][j]=0;}for(m=0;mn;m++){for(i=0;in;i++){for(k=0;kn;k++){for(j=0;jn;j++){b[i][k]=b[i][k]||(c[i][j]*a[j][k]);}}}for(p=0;pn;p++){for(q=0;qn;q++)c[p][q]=b[p][q];}for(p=0;pn;p++){for(q=0;qn;q++){d[p][q]=d[p][q]||b[p][q];b[p][q]=0;}}}printf(矩阵的传递闭包为\n);for(i=0;in;i++){for(j=0;jn;j++){printf(%4d,d[i][j]);}printf(\n);}};break;case4:{for(j=0;jn;j++){for(k=0;kn;k++){if(a[k][j]==1){for(i=0;in;i++)a[k][i]=a[k][i]||a[j][i];}}}printf(传递闭包为\n);for(i=0;in;i++){for(j=0;jn;j++)printf(%4d,a[i][j]);printf(\n);}};break;default:printf(Error\n);}}inthe(inta,intb){intc;if(a==0&&b==0)c=0;elsec=1;returnc;}实验三计算两结点间长度为m的路的数目实验内容:从键盘输入图的邻接矩阵和一正整数m,计算结点两两之间长度为m的路的数目。考虑有向图和无向图。用C语言实现。实现可达性矩阵。实验源程序和运行结果如下:#includestdio.hvoidmain(){inta[100][100],b[100][100],c[100][100],d[100][100],i,j,k,t,p,q,n,m;printf(请输入关系矩阵的阶数\n);scanf(%d,&n);printf(请输入路的长度\n);scanf(%d,&m);printf(请输入此关系矩阵\n);for(i=0;in;i++){for(j=0;jn;j++){scanf(%d,&a[i][j]);c[i][j]=a[i][j];d[i][j]=a[i][j];b[i][j]=0;}}for(t=0;tm-1;t++){for(i=0;in;i++){for(j=0;jn;j++){for(k=0;kn;k++)b[i][j]+=c[i][k]*a[k][j];}}for(p=0;pn;p++){for(q=0;qn;q++){c[p][q]=b[p][q];b[p][q]=0;}}}for(k=0,i=0;in;i++){for(j=0;jn;j++)k+=c[i][j];}printf(结点两两之间长度为%d的路的数目为%d\n,m,k);for(t=0;tn;t++){for(i=0;in;i++){for(j=0;jn;j++){for(k=0;kn;k++)b[i][j]+=c[i][k]*a[k][j];}}for(p=0;pn;p++){for(q=0;qn;q++){c[p][q]=b[p][q];b[p][q]=0;d[p][q]+=c[p][q];}}}printf(该关系矩阵的可达型矩阵为\n);for(i=0;in;i++){for(j=0;jn;j++){if(d[i][j]=1)d[i][j]=1;elsed[i][j]=0;printf(%4d,d[i][j]);}printf(\n);}}实验四最优树的构造实验内容:从键盘输入一组权值,构造出对应的最优树,列出构造过程。用C语言实现。实验源程序和运行结果如下:#includestdio.hvoidmain(){inta[100][100],d[100][100]={0};inti,j,k,min,m,n,p;intb[100][100]={0};intc[100][100];printf(请输入邻接矩阵的阶数:);scanf(%d,&p);for(i=0;ip;i++){printf(请输入带权值矩阵的第%d行,用空格隔开:,i+1);for(j=0;jp;j++)scanf(%d,&a[i][j]);}for(i=0;ip;i++)for(j=0;jp;j++)c[i][j]=a[i][j];for(k=0;kp*p;k++){min=100;for(i=0;ip;i++)for(j=0;jp;j++){if(a[i][j]==0)continue;elseif(a[i][j]min){min=a[i][j];m=i,n=j;}}a[m][n]=a[n][m]=0;if(b[m][n]==1||b[n][m]==1)continue;d[m][n]=d[n][m]=1;for(i=0;ip;i++)for(j=0;jp;j++)b[i][j]=d[i][j];for(i=0;ip;i++)for(j=0;jp;j++)if(b[j][i]==1)for(k=0;kp;k++)b[j][k]=b[j][k]||b[i][k];}for(i=0;ip;i++)for(j=0;jp;j++)if(d[i][j]==1)d[i][j]=c[i][j];printf(最小生成树的邻接矩阵为(带权值):\n);for(i=0;ip;i++){for(j=0;jp;j++){printf(%d,d[i][j]);}printf(\n);}}