高斯消元集合

来源:互联网 发布:windows自动修复 编辑:程序博客网 时间:2024/06/14 04:42
  1. //高斯消元法解异或方程组,返回方程解得个数。  
  2. const int N = 30;  
  3. int A[N][N];//关系矩阵  
  4. int Gauss(int equ,int var){//返回解得个数。  
  5.     int row,col;  
  6.     for(row=0,col=0;row<equ&&col<var;col++,row++){  
  7.         int max_r=row;//默认最大为本行  
  8.         for(int i=row+1;i<equ;i++){//从上到下找出最大的,此处01矩阵为1  
  9.             if(A[row][col]==1)  
  10.                 break;  
  11.             if(A[max_r][col]<A[i][col]){  
  12.                 max_r=i;break;  
  13.             }  
  14.         }  
  15.         if(max_r!=row){  
  16.             for(int j=0;j<=var;j++)swap(A[max_r][j],A[row][j]);  
  17.         }  
  18.         if(A[row][col]==0){  
  19.             row--;//重新查找本行下一列  
  20.         }  
  21.         for(int i=row+1;i<equ;i++){  
  22.             if(A[i][col]==0)continue;//如果某行已为0,则跳过本行  
  23.             for(int j=col;j<=var;j++){  
  24.                 A[i][j]^=A[row][j];  
  25.             }  
  26.         }  
  27.     }  
  28.     for(int i=row;i<equ;i++){  
  29.         if(A[i][col]!=0)return -1;  
  30.     }  
  31.     return 1<<(n-row);//可能会用long long  1LL<<(n-row)  
  32. }  
[cpp] view plain copy
  1. //高斯消元法解异或方程组(枚举所有解)  
  2. const int N = 30;  
  3. int n;  
  4. int A[N][N];  
  5. int Major[N];//记录主元所在位置  
  6. int x[N];//临时解 x[]={0,1};  
  7.   
  8. void DFS_freevar(int n,int r,int var){//递归枚举自由元  
  9.     if(var==-1){  
  10.           
  11.         //...对于每一个解进行处理。  
  12.     }  
  13.     if(var==Major[r]){//当前为主元  
  14.         int y=A[r][n];  
  15.         for(int i=var+1;i<n;i++){  
  16.             y^=(A[r][i]*x[i]);  
  17.         }  
  18.         x[var]=y;  
  19.         DFS_freevar(n,r-1, var-1) ;  
  20.     }  
  21.     else{//不是主元枚举  
  22.         for(int i=0;i<2;i++){  
  23.             x[var]=i;  
  24.              DFS_freevar(n,r, var-1) ;  
  25.         }  
  26.     }  
  27.     
  28. }  
  29. int Gauss(int equ,int var){//返回是否有解  
  30.     int row,col;  
  31.     for(row=0,col=0;col<var&&row<equ;col++,row++){  
  32.         int max_r=row;  
  33.         for(int i=row+1;i<equ;i++){  
  34.             if(A[row][col]==1)break;  
  35.             if(A[max_r][col]<A[i][col]){  
  36.                 max_r=i;break;  
  37.             }  
  38.         }  
  39.         if(A[max_r][col]==0){  
  40.             row--;  
  41.             continue;  
  42.         }  
  43.         if(max_r!=row)  
  44.             for(int j=0;j<=var;j++)  
  45.                 swap(A[row][j],A[max_r][j]);  
  46.         for(int i=row+1;i<equ;i++){  
  47.             if(A[i][col]==0)continue;  
  48.             for(int j=col;j<=var;j++){  
  49.                 A[i][j]^=A[row][j];  
  50.             }  
  51.         }  
  52.         Major[row]=col;  
  53.     }  
  54.     for(int i=row;i<equ;i++){//无解的情况  
  55.         if(A[i][col]!=0)return -1;  
  56.     }  
  57.     DFS_freevar(n,row-1,col-1);  
  58.     return 1;  
  59. }  

[cpp] view plain copy
  1. //浮点型只有唯一解时可计算  
  2. const int N = 300;  
  3. const int INF=0x7fffffff;  
  4. #define eps 1e-9  
  5. double A[N][N];  
  6. double x[N];  
  7. void Gauss(int equ,int var){  
  8.     int row,col;  
  9.     for(row=0,col=0;col<var&&row<equ;col++,row++){  
  10.         int max_r=row;  
  11.         for(int i=row+1;i<equ;i++){  
  12.             if(eps<fabs(A[i][col])-fabs(A[max_r][col])){  
  13.                 max_r=i;  
  14.             }  
  15.         }  
  16.         if(max_r!=row)  
  17.             for(int j=0;j<var+1;j++)  
  18.                 swap(A[row][j],A[max_r][j]);  
  19.         for(int i=row+1;i<equ;i++){  
  20.             if(fabs(A[i][col])<eps)continue;  
  21.             double tmp=-A[i][col]/A[row][col];  
  22.             for(int j=col;j<var+1;j++){  
  23.                 A[i][j]+=tmp*A[row][j];  
  24.             }  
  25.         }  
  26.          
  27.     }  
  28.       
  29.        for(int i=var-1;i>=0;i--){//计算唯一解。  
  30.         double tmp=0;  
  31.         for(int j=i+1;j<var;j++){  
  32.             tmp+=A[i][j]*x[j];  
  33.         }  
  34.         x[i]=(A[i][var]-tmp)/A[i][i];  
  35.     }  
  36. }