【模板】各种高斯消元

各种高斯消元 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]);
}
  以上由于都是直接从原来本蒟蒻代码里面复制过来的,如果有错误一定指出(有时间进行修订)。
posted @ 2018-05-05 22:59  Newuser233  阅读(6)  评论(0)    收藏  举报