[SDOI2006] 线性方程组

洛谷 P2455 传送门

刚开始写了个消成上三角的,结果狂wa。

后来经过研究发现,消成上三角那种不能直接判断无解或无穷多解,需要其它的操作。

所以干脆学了个消成对角线的,写了一发A了。

其实两种消元的方法都差不多,就当存个板子吧。

 1 #include<cstdio>
 2 
 3 void swap(double &x,double &y)
 4 {
 5     double t=x;x=y;y=t;
 6 }
 7 
 8 double v(double rx)
 9 {
10     return rx>0?rx:(-rx);
11 }
12 
13 int n;
14 double a[55][55];
15 double x[55];
16 const double eps=0.00001;
17 
18 int main()
19 {
20     scanf("%d",&n);
21     for(int i=1;i<=n;i++)
22         for(int j=1;j<=n+1;j++)
23             scanf("%lf",&a[i][j]);
24     for(int i=1;i<=n;i++)
25     {
26         int p=i;
27         for(int j=i+1;j<=n;j++)
28             if(v(a[j][i])>v(a[p][i]))p=j;
29         if(i!=p)for(int j=i;j<=n+1;j++)swap(a[i][j],a[p][j]);
30         if(v(a[i][i])<eps)continue;
31         double div=a[i][i];
32         for(int j=i;j<=n+1;j++)a[i][j]/=div;
33         for(int j=1;j<=n;j++)
34         {
35             if(i==j)continue;
36             double div=a[j][i];
37             for(int k=1;k<=n+1;k++)
38                 a[j][k]-=div*a[i][k];
39         }
40     }
41     int no=0,inf=0;
42     for(int i=1;i<=n;i++)
43     {
44         int p=1;
45         while(p<=n+1&&v(a[i][p])<=eps)p++;
46         if(p==n+1)no=1;
47         if(p>n+1)inf=1;
48     }
49     if(no){printf("-1");return 0;}
50     if(inf){printf("0");return 0;}
51     for(int i=n;i;i--)x[i]=a[i][n+1];
52     for(int i=1;i<=n;i++)
53         printf("x%d=%.2lf
",i,x[i]);
54     return 0;
55 }
原文地址:https://www.cnblogs.com/eternhope/p/9922628.html