高斯消元模板

typedef int Matrix[maxn][maxn];
int gcd(int a,int b)
{
    return b==0?a:gcd(b,a%b);
}
int lcm(int a,int b)
{
    return  a/gcd(a,b)*b;
}
int gauss(Matrix A,int n,int m)
{
    int row,col;
    for(row=0,col=0; row<n&&col<m; row++,col++)
    {
        int r=row;
        for(int i=row+1; i<n; i++)
            if(abs(A[i][col])>abs(A[r][col])) r=i;
        if(r!=row) for(int j=0; j<=m; j++) swap(A[r][j],A[row][j]);
        if(A[row][col]==0)
        {
            row--;
            continue;
        }
        for(int k=row+1; k<n; k++)//消元过程
            if(A[k][col])
            {
                int LCM=lcm(abs(A[k][col]),abs(A[row][col]));
                int ra=LCM/abs(A[k][col]);
                int rb=LCM/abs(A[row][col]);
                if (A[k][col]*A[row][col]<0) rb=-rb;
                for(int j=col; j<=m; j++)
                {
                    A[k][j]=A[k][j]*ra-A[row][j]*rb;
                }
            }
    }
    for(int i=row; i<n; i++)//无解情况
        if(A[i][m]) return -1;
    if(row<m) return 0;//多解
    for(int i=m-1; i>=0; i—)//回代过程
    {
        for(int j=i+1; j<m; j++)
        {
            A[i][m]-=A[j][m]*A[i][j];
        }
        A[i][m]/=A[i][i];
    }
    return 1;
}

posted on 2014-03-25 21:13  仗剑奔走天涯  阅读(161)  评论(0编辑  收藏  举报

导航