【模板】各种高斯消元
各种高斯消元
dfs是枚举自由元,方法来自ciocio
异或版本,可判无解,单解,自由元枚举得异或版本高斯消元模板(使用率最高)
int minn; int num[2005]; int ans[2005]; void dfs(int x,int y) { if(x==0&&y==0) { int cnt=0; for(int i=1;i<=N;i++) cnt+=ans[i]; minn=min(minn,cnt); return; } if(num[x]==y) { ans[y]=A[x][N+1]; for(int i=y+1;i<=N;i++) ans[y]^=(A[x][i]&ans[i]); dfs(x-1,y-1); } else { ans[y]=1; dfs(x,y-1); ans[y]=0; dfs(x,y-1); } }// from ciocio void gauss() { int x,y,maxr; for(x=1,y=1;x<=N&&y<=N;x++,y++) { for(maxr=x;maxr<=N&&(!A[maxr][y]);maxr++); if(maxr==N+1) { x--; continue; } if(maxr!=x) for(int j=y;j<=N+1;j++) swap(A[x][j],A[maxr][j]); num[x]=y; for(int i=x+1;i<=N;i++) { if(A[i][y]) for(int j=y;j<=N+1;j++) A[i][j]^=A[x][j]; } } for(int i=x;i<=N;i++) if(A[i][N+1]) { printf("inf\n"); return; }; minn=0x3f3f3f3f; dfs(x-1,N); printf("%d\n",minn); }我去,原本本来准备在这里放朴素高斯消元的,居然我一道朴素高斯消元(整数意义下,我们平时解得那些整数方程)都没有做过,,可见基本不会用就不放了 小数版本高斯消元
void gauss() { int maxr; double tmp; for(int x=1;x<=n;x++) { maxr=x; for(int i=x+1;i<=n;i++) if(A[maxr][x]>A[x][x]) maxr=i; if(maxr!=x) for(int i=x;i<=n+1;i++) swap(A[maxr][i],A[x][i]); for(int i=x+1;i<=n;i++) { tmp=A[i][x]/A[x][x]; for(int j=x;j<=n+1;j++) A[i][j]-=tmp*A[x][j]; } } for(int i=n;i>=1;i--) { for(int j=i+1;j<=n;j++) { A[i][n+1]-=A[j][n+1]*A[i][j]; } A[i][n+1]/=A[i][i]; } for(int i=1;i<=n-1;i++) printf("%.3f ",A[i][n+1]); printf("%.3f",A[n][n+1]); }以上由于都是直接从原来本蒟蒻代码里面复制过来的,如果有错误一定指出(有时间进行修订)。