hdu6465 高斯消元
Posted lhclqslove
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu6465 高斯消元相关的知识,希望对你有一定的参考价值。
题目链接:水题
题解:来自官方
1 #include<bits/stdc++.h> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cstdio> 6 #include<vector> 7 #include<stack> 8 #include<queue> 9 #include<cmath> 10 #include<map> 11 #include<set> 12 #define ll long long 13 #define ls l,m,rt<<1 14 #define rs m+1,r,rt<<1|1 15 #define ull unsigned long long 16 #define pb push_back 17 #define P pair<ll,ll> 18 #define f first 19 #define s second 20 using namespace std; 21 const int N = 101; 22 const double EPS=1e-10; 23 int m,n; 24 int a[N][N]; 25 int free_x[N]; 26 double x[N]; 27 double ans[10]; 28 int gcd(int a,int b){ 29 if(!b) return a; else return gcd(b,a%b); 30 } 31 int lcm(int a,int b){ 32 return a/gcd(a,b)*b; 33 } 34 int Gauss(int equ,int var){ 35 int k,max_r,col = 0,ta,tb; 36 int LCM,temp,num = 0,free_index; 37 for(int i=0;i<=var;i++){ 38 x[i]=0; 39 free_x[i]=true; 40 } 41 for(k = 0;k < equ && col < var;k++,col++){ 42 max_r=k; 43 for(int i=k+1;i<equ;i++){ 44 if(abs(a[i][col])>abs(a[max_r][col])) max_r=i; 45 } 46 if(max_r!=k){// 与第k行交换. 47 for(int j=k;j<var+1;j++) swap(a[k][j],a[max_r][j]); 48 } 49 if(a[k][col]==0){// 说明该col列第k行以下全是0了,则处理当前行的下一列. 50 free_x[num++] = col; 51 k--; 52 continue; 53 } 54 for(int i=k+1;i<equ;i++){// 枚举要删去的行. 55 if(a[i][col]!=0){ 56 LCM = lcm(abs(a[i][col]),abs(a[k][col])); 57 ta = LCM/abs(a[i][col]); 58 tb = LCM/abs(a[k][col]); 59 if(a[i][col]*a[k][col]<0)tb=-tb;//异号的情况是相加 60 for(int j=col;j<var+1;j++){ 61 a[i][j] = a[i][j]*ta-a[k][j]*tb; 62 } 63 } 64 } 65 } 66 //无解 67 for (int i = k; i < equ; i++){ 68 if (a[i][col] != 0) return -1; 69 } 70 //无穷解 71 if (k < var){ 72 return var - k; // 自由变元有var - k个. 73 } 74 //唯一解 75 for (int i = var - 1; i >= 0; i--){ 76 double temp = a[i][var]; 77 for (int j = i + 1; j < var; j++){ 78 if (a[i][j] != 0) temp -= a[i][j] * x[j]; 79 } 80 //if (temp % a[i][i] != 0) return -2; // 说明有浮点数解,但无整数解. 81 x[i] = 1.0*temp / a[i][i]; 82 } 83 return 0; 84 } 85 struct point 86 { 87 int x,y; 88 }st[10]; 89 int main() 90 { 91 int T; 92 scanf("%d",&T); 93 while(T--) 94 { 95 for(int i=1;i<=6;i++) 96 { 97 scanf("%d %d",&st[i].x,&st[i].y); 98 } 99 a[0][0]=st[1].x;a[0][1]=st[1].y;a[0][2]=1;a[0][3]=st[4].x; 100 a[1][0]=st[2].x;a[1][1]=st[2].y;a[1][2]=1;a[1][3]=st[5].x; 101 a[2][0]=st[3].x;a[2][1]=st[3].y;a[2][2]=1;a[2][3]=st[6].x; 102 int tmp=Gauss(3,3); 103 ans[0]=x[0];ans[1]=x[1];ans[2]=x[2]; 104 a[0][0]=st[1].x;a[0][1]=st[1].y;a[0][2]=1;a[0][3]=st[4].y; 105 a[1][0]=st[2].x;a[1][1]=st[2].y;a[1][2]=1;a[1][3]=st[5].y; 106 a[2][0]=st[3].x;a[2][1]=st[3].y;a[2][2]=1;a[2][3]=st[6].y; 107 tmp=Gauss(3,3); 108 ans[3]=x[0];ans[4]=x[1];ans[5]=x[2]; 109 int q; 110 scanf("%d",&q); 111 while(q--) 112 { 113 int x,y; 114 scanf("%d %d",&x,&y); 115 double tx=ans[0]*x+ans[1]*y+ans[2]; 116 double ty=ans[3]*x+ans[4]*y+ans[5]; 117 printf("%.2f %.2f ",tx,ty); 118 } 119 } 120 121 return 0; 122 }
以上是关于hdu6465 高斯消元的主要内容,如果未能解决你的问题,请参考以下文章
hdu3976(Electric resistance) 高斯消元