当前位置:文档之家› c语言求基本关联矩阵

c语言求基本关联矩阵

矿井通风网络论程序作业学院:矿业学院专业:安全工程姓名:雷斌学号:********** 年级:2012 级任课教师:袁梅2015年5 月 6 日这是个5,7图,以树T={e2,e4,e6,e7}在前余树弦在后的顺序,求B1,C f , S f下面是我所写程序,(是用C语言写的)#include <stdio.h>#include <stdlib.h>#include <conio.h>#include <math.h>int m,n;double **a,**b11,**b12,**zb11,**zb12,**nzb12,**c12,*C,*AA,*B,**sf,**s11,**cf,**B1; double *Q,*Z;void Create_Omr(int m,int n);//创建原始矩阵变量函数void Free_mr();int brinv(double *a,int n);void brmul(double a[], double b[],int m,int n,int k,double c[]);void main(){int i,j,M,k;int t=0;printf("输入m ");scanf("%d",&m);printf("输入n ");scanf("%d",&n);M=m-1;Create_Omr(m,n);//调用创建动态数组函数printf("输入起点Q[n]");for (i=0;i<n;i++)scanf("%lf",&Q[i]);printf("输入终点Z[n]");for (i=0;i<n;i++)scanf("%lf",&Z[i]);printf("<开始计算各个矩阵>\n");for (i=0;i<m;i++)for (j=0;j<n;j++)a[i][j]=0.0;//初始化a的值全部置0for(j=0;j<n;j++) //求关联矩阵的过程{ i=(int)Q[j]-1;a[i][j]=1;}for(j=0;j<n;j++){ i=(int)Z[j]-1;a[i][j]=-1;}printf("输出关联矩阵B\n");for(i=0;i<m;i++){for(j=0;j<n;j++)printf("%3d",(int)a[i][j]);printf("\n");}printf("输入基本关联矩阵B");scanf("%d",&k);for(i=0;i<m-1;i++)/////求基本关联矩阵Bk{if(i==(k-1)){ for(j=0;j<n;j++)B1[i][j]=a[k][j];t++;}elsefor(j=0;j<n;j++)B1[i][j]=a[i+t][j];}printf("输出基本关联矩阵B%d\n",k);for(i=0;i<m-1;i++){for(j=0;j<n;j++)printf("%3d",(int)B1[i][j]);printf("\n");}for(i=0;i<m-1;i++)//求B11for(j=0;j<n-m+1;j++)b11[i][j]=B1[i][j];for(i=0;i<m-1;i++)//求B12for(j=n-m+1;j<n;j++)b12[i][j-n+m-1]=B1[i][j];for(i=0;i<m-1;i++)//求-ZB11for(j=0;j<n-m+1;j++)zb11[j][i]=-(int)b11[i][j];for(i=0;i<m-1;i++)//求ZB12for(j=0;j<m-1;j++)zb12[j][i]=b12[i][j];/*从这里开始把二维数组接入一位数组,(因为动态二维数组分配的内存空间不是连续的,所以用一个一维数组记录他的数据好传给逆矩阵的调用函数)*/for (i=0; i<m-1; i++)for(j=0;j<m-1;j++){AA[i*(m-1)+j]=zb12[i][j];//这里必须给AA 和B赋值我把zb12赋值给它们不然是随机数B[i*(m-1)+j]=zb12[i][j];}i=brinv(AA,M);//求逆矩阵调用函数k=0;for(i=0;i<m-1;i++)//把所求得逆矩阵,从新变成二维数组,方便C12的计算for(j=0;j<m-1;j++){nzb12[i][j]=AA[k];k++;}for (i=0;i<n-m+1;i++)//这里必须给c12赋0,不然求不出c12for (j=0;j<m-1;j++)c12[i][j]=0.0;for (i=0;i<n-m+1;i++)//求c12的过程,用循环语句来计算矩阵的乘法{for (j=0;j<m-1;j++){for (k=0;k<m-1;k++){c12[i][j]=c12[i][j]+zb11[i][k]*nzb12[k][j];//矩阵的乘法}}}for(i=0;i<n-m+1;i++)/*求cf矩阵的过程*/for(j=0;j<n-m+1;j++)if(i==j)cf[i][j]=1.0;elsecf[i][j]=0.0;for(i=0;i<n-m+1;i++)for(j=0;j<m-1;j++)cf[i][j+n-m+1]=c12[i][j];printf("独立回路矩阵cf:\n");//输出cf矩阵for(i=0;i<n-m+1;i++){for(j=0;j<n;j++)printf("%3d",(int)cf[i][j]);printf("\n");}for(i=0;i<n-m+1;i++)//求s11矩阵的过程for(j=0;j<m-1;j++)s11[j][i]=-c12[i][j];for(i=0;i<m-1;i++)////求sf矩阵的过程sf[i][i+n-m+1]=1;for(i=0;i<m-1;i++)for(j=0;j<n-m+1;j++)sf[i][j]=s11[i][j];printf("独立割集矩阵sf:\n");for(i=0;i<m-1;i++)//输出sf矩阵{for(j=0;j<n;j++)printf("%3d",(int)sf[i][j]);printf("\n");}}void Create_Omr(int m,int n)//创建各个矩阵{ int i;printf("你输的是一个%d,%d图\n",m,n);a=(double **)malloc(m*sizeof(double));b11=(double **)malloc((m-1)*sizeof(double));b12=(double **)malloc((m-1)*sizeof(double));zb11=(double **)malloc((n-m+1)*sizeof(double));zb12=(double **)malloc((m-1)*sizeof(double));C=(double *)malloc((m-1)*(m-1)*sizeof(double));B=(double *)malloc((m-1)*(m-1)*sizeof(double));AA=(double *)malloc((m-1)*(m-1)*sizeof(double));cf=(double **)malloc((n-m+1)*sizeof(double));sf=(double **)malloc((m-1)*sizeof(double));s11=(double **)malloc((m-1)*sizeof(double));B1=(double **)malloc((m-1)*sizeof(double));nzb12=(double **)malloc((m-1)*sizeof(double));c12=(double **)malloc((n-m+1)*sizeof(double));Q=(double *)malloc(n*sizeof(double));Z=(double *)malloc(n*sizeof(double));for(i = 0; i < m; i++)a[i] = (double *)malloc(n * sizeof(double));//动态分配矩阵列数组for(i = 0; i < m-1; i++)b11[i] = (double *)malloc((n-m+1) * sizeof(double));//动态分配矩阵列数组for (i=0;i<m-1;i++){b12[i]=(double *)malloc((m-1) * sizeof(double));//动态分配矩阵列数组zb12[i]=(double *)malloc((m-1) * sizeof(double));//动态分配矩阵列数组nzb12[i]=(double *)malloc((m-1) * sizeof(double));//动态分配矩阵列数组s11[i]= (double *)malloc((n-m+1) * sizeof(double));//动态分配矩阵列数组sf[i]=(double *)malloc(n * sizeof(double));//动态分配矩阵列数组B1[i]=(double *)malloc(n * sizeof(double));//动态分配矩阵列数组}for (i=0;i<n-m+1;i++){zb11[i]=(double *)malloc((m-1) * sizeof(double));//动态分配矩阵列数组c12[i]=(double *)malloc((m-1) * sizeof(double));//动态分配矩阵列数组cf[i]=(double *)malloc(n * sizeof(double));//动态分配矩阵列数组}}int brinv(double *a, int n)//求逆矩阵的函数{ int *is,*js,i,j,k,l,u,v;double d,p;is=malloc(n*sizeof(double));js=malloc(n*sizeof(double));for (k=0; k<=n-1; k++){ d=0.0;for (i=k; i<=n-1; i++)for (j=k; j<=n-1; j++){ l=i*n+j; p=fabs(a[l]);if (p>d) { d=p; is[k]=i; js[k]=j;}}if (d+1.0==1.0){ free(is); free(js); printf("err**not inv\n");return(0);}if (is[k]!=k)for (j=0; j<=n-1; j++){ u=k*n+j; v=is[k]*n+j;p=a[u]; a[u]=a[v]; a[v]=p;}if (js[k]!=k)for (i=0; i<=n-1; i++){ u=i*n+k; v=i*n+js[k];p=a[u]; a[u]=a[v]; a[v]=p;}l=k*n+k;a[l]=1.0/a[l];for (j=0; j<=n-1; j++)if (j!=k){ u=k*n+j; a[u]=a[u]*a[l];}for (i=0; i<=n-1; i++)if (i!=k)for (j=0; j<=n-1; j++)if (j!=k){ u=i*n+j;a[u]=a[u]-a[i*n+k]*a[k*n+j];}for (i=0; i<=n-1; i++)if (i!=k){ u=i*n+k; a[u]=-a[u]*a[l];}}for (k=n-1; k>=0; k--){ if (js[k]!=k)for (j=0; j<=n-1; j++){ u=k*n+j; v=js[k]*n+j;p=a[u]; a[u]=a[v]; a[v]=p;}if (is[k]!=k)for (i=0; i<=n-1; i++){ u=i*n+k; v=i*n+is[k];p=a[u]; a[u]=a[v]; a[v]=p;}}free(is); free(js);return(1);}///注意,用malloc动态分配数组,本应该释放的,但为了程序短一点,所以就不释放了。

相关主题