Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
|
![]() |
#1 |
初级会员
注册日期: 2012-04-11
年龄: 36
帖子: 3
声望力: 0 ![]() |
![]()
如题,请高手帮帮忙,感激不尽
#include "stdio.h" #include "string.h" #define N 50 int jisuan(int a[N][N][N],int h,int z,int i,int j); void micifang(int a[N][N][N],int h,int t); void buer(int a[N][N][N],int h); void warshall(int a[N][N][N],int h); main() { int i,h,j,t; int a[N][N][N]; printf("请输入邻接矩阵A的行数(或列数):\n"); scanf("%d",&h); printf("\n请输入邻接矩阵A:\n\n"); for(i=0;i<h;i++) { printf("请输入邻接矩阵A的第%d行.\n",i+1); for(j=0;j<h;j++) scanf("%d",&a[0][i][j]); } printf("\n邻接矩阵A为:\n"); for(i=0;i<h;i++) { for(j=0;j<h;j++) printf(" %d ",a[0][i][j]); printf("\n"); } printf("\n\n\n算法一:\n"); printf("\n矩阵A的1次方为:\n"); for(i=0;i<h;i++) { for(j=0;j<h;j++) printf(" %d ",a[0][i][j]); printf("\n"); } micifang(a,h,2); for(i=0;i<h;i++) for(j=0;j<h;j++) a[h][i][j]=0; //全部赋值为0! for(i=0;i<h;i++) for(j=0;j<h;j++) for(t=0;t<h;t++) a[h][i][j]=a[h][i][j]+a[t][i][j]; printf("\n\nB的值如下:\n"); for(i=0;i<h;i++) { for(j=0;j<h;j++) printf(" %d ",a[h][i][j]); printf("\n"); } printf("\n\n\n算法二:\n"); printf("\n矩阵A的1次布尔幂次方为:\n"); for(i=0;i<h;i++) { for(j=0;j<h;j++) { if(a[0][i][j]>1) a[0][i][j]=1; printf(" %d ",a[0][i][j]); } printf("\n"); } buer(a,h,2); printf("\n\nP的值如下:\n"); for(i=0;i<h;i++) { for(j=0;j<h;j++) { if(a[h][i][j]>1) a[h][i][j]=1; printf(" %d ",a[h][i][j]); } printf("\n"); } printf("\n\n\nwarshall算法:\n\n"); for(i=0;i<h;i++) //处理邻接矩阵A.转化成可达矩阵。 for(j=0;j<h;j++) if(a[0][i][j]!=0) a[0][i][j]=1; printf("整理后的可达矩阵为:\n"); for(i=0;i<h;i++) { for(j=0;j<h;j++) printf(" %d ",a[0][i][j]); printf("\n"); } warshall(a,h); getch(); } int jisuan(int a[N][N][N],int h,int z,int i,int j) { int s,jg=0; if(z==2) for(s=0;s<h;s++) jg=jg+a[z-2][i][s]*a[z-2][s][j]; else for(s=0;s<h;s++) jg=jg+a[z-2][i][s]*a[0][s][j]; return jg; } void micifang(int a[N][N][N],int h,int t) { int i,j,s=0; int z=t; if(z<h) //矩阵的值不全为零。 { for(i=0;i<h;i++) for(j=0;j<h;j++) a[z-1][i][j]=0; //全部赋值为0! for(i=0;i<h;i++) for(j=0;j<h;j++) a[z-1][i][j]=jisuan(a,h,z,i,j); printf("\n矩阵A的%d次方为:\n",z); for(i=0;i<h;i++) { for(j=0;j<h;j++) printf(" %d ",a[z-1][i][j]); printf("\n"); } micifang(a,h,++z); } } void buer(int a[N][N][N],int h,int t) { int i,j,s=0; int z=t; if(z<h) //矩阵的值不全为零。 { for(i=0;i<h;i++) for(j=0;j<h;j++) a[z-1][i][j]=0; //全部赋值为0! for(i=0;i<h;i++) for(j=0;j<h;j++) a[z-1][i][j]=jisuan(a,h,z,i,j); printf("\n矩阵A的%d次布尔幂次方为:\n",z); for(i=0;i<h;i++) { for(j=0;j<h;j++) { if(a[z-1][i][j]>1) a[z-1][i][j]=1; printf(" %d ",a[z-1][i][j]); } printf("\n"); } buer(a,h,++z); } } void warshall(int a[N][N][N],int h) { int i,j,p,q,r=0,s; for(j=0;j<h;j++) for(i=0;i<h;i++) if(i!=j && a[0][i][j]==1) { for(s=0;s<h;s++) { a[0][i][s]=a[0][i][s]+a[0][j][s]; if(a[0][i][s]==2) a[0][i][s]=1; } printf("\n第%d次运算的结果如下:\n",++r); for(p=0;p<h;p++) { for(q=0;q<h;q++) printf(" %d ",a[0][p][q]); printf("\n"); } } } |
![]() |
![]() |