题解 P2455 [SDOI2006] 线性方程组

#include<bits/stdc++.h>
using namespace std;
int m,n,flag[52],bj[52],s,r;
double matrix_up[52][52],ans_up[52];
void input()
{
    cin>>m;
    n=m+1;
    for(int i=1;i<=m;i++)
        for(int j=1;j<=n;j++)
            cin>>matrix_up[i][j];  
}
void cut(int one,int two,int list)
{
	if(!two)
	{
		for(int i=list+1;i<=n;i++)
			matrix_up[one][i]/=matrix_up[one][list];
        matrix_up[one][list]=1;	
    	return;
	}
    for(int i=list+1;i<=n;i++)
    {
        matrix_up[one][i]/=matrix_up[one][list];
        matrix_up[two][i]/=matrix_up[two][list];
    }
    matrix_up[one][list]=1;
    matrix_up[two][list]=1;    
    for(int i=1;i<=n;i++)
    {
        matrix_up[two][i]=matrix_up[two][i]-matrix_up[one][i];
    }
}
void work()
{
    for(int list=1;list<=n-1;list++)
    {
        short one=0,two=0;
        for(int i=1;i<=m;i++)
        {
            if(one && matrix_up[i][list]!=0 && !bj[i])
            {
                two=i;
                cut(one,two,list);
            }
            if(matrix_up[i][list]!=0 && !bj[i])
            {
                one=i;
                cut(one,0,list);
                flag[list]=i;//搞个指针
                bj[i]=1;//这一行是否处理过
            }
        }
    }
    for(int i=1;i<=m;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(matrix_up[i][j])
            {
                r++;
                if(j!=n)
                    s++;
                break;
            }
        }
    }
    ans_up[n]=-1;//bi赋值便于运算
    for(int list=n-1;list>=1;list--)
    {
        for(int i=list+1;i<=n;i++)
        {
            ans_up[list]-=matrix_up[flag[list]][i]*ans_up[i];
        }
    }
}
void output()
{
    if(s<r)
    {
        cout<<"-1";
        return ;
    }
    else if(r<n-1)
    {
	    cout<<"0";
        return;
    }
    for(int i=1;i<=m;i++)
    {
        cout<<"x"<<i<<"=";
        printf("%.2lf\n",ans_up[i]);
    }
}
int main()
{
    input();
    work();
    output();
    return 0;
}
posted @ 2023-09-14 23:19  G_A_TS  阅读(8)  评论(0编辑  收藏  举报