【模板】各种高斯消元
各种高斯消元
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]);
}
以上由于都是直接从原来本蒟蒻代码里面复制过来的,如果有错误一定指出(有时间进行修订)。

浙公网安备 33010602011771号