【BZOJ1013】球形空间产生器sphere

高斯消元模板题

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <iostream>
 5 #include <cmath>
 6 
 7 using namespace std;
 8 
 9 const int maxn=30;
10 const double EPS=1e-9;
11 double G[maxn][maxn];
12 double a[maxn][maxn];
13 double ans[maxn];
14 int n;
15 double g;
16 void gauss_jordan(){
17     int num;
18     for(int i=1;i<n;i++){
19         num=i;
20         for(int j=i+1;j<=n;j++){
21             if(fabs(a[j][i])>fabs(a[num][i]))
22                 num=j;
23         }
24         for(int j=1;j<=n+1;j++)
25             swap(a[i][j],a[num][j]);
26         for(int j=i+1;j<=n;j++){
27             if(fabs(a[j][i])<=EPS)continue;
28             double t=a[j][i]/a[i][i];
29             for(int k=i;k<=n+1;k++){
30                 a[j][k]-=a[i][k]*t;
31             }
32         }
33     }
34     for(int i=n;i>=1;i--){
35         ans[i]=a[i][n+1]/a[i][i];
36         for(int j=i-1;j>=1;j--){
37             a[j][n+1]-=a[j][i]*ans[i];
38         }
39     }
40 }
41 int main(){
42     scanf("%d",&n);
43     for(int i=1;i<=n+1;i++){
44         for(int j=1;j<=n;j++){
45             scanf("%lf",&g);
46             G[i][j]+=-2.0*g;
47             G[i][n+1]+=g*g;
48         }
49     }
50     for(int i=1;i<=n;i++){
51             for(int l=1;l<=n+1;l++){
52                 a[i][l]=G[i][l]-G[i+1][l];
53             }
54             a[i][n+1]=-a[i][n+1];
55 
56     }
57 
58     /*for(int i=1;i<=n;i++){
59         for(int j=1;j<=n+1;j++){
60             printf("%.1f ",a[i][j]);
61         }
62         printf("\n");
63     }*/
64     gauss_jordan();
65     for(int i=1;i<=n;i++){
66         printf("%.3f ",ans[i]);
67     }
68 
69     return 0;
70 }
View Code

 

posted @ 2018-05-22 11:45  蒟蒻LQL  阅读(182)  评论(0编辑  收藏  举报