高斯消元 模板

照着czyuan的那个模板,手敲了一遍,存一下。

貌似今天一整天就看了一下高斯消元的知识,然后看了模板,又手敲了一遍。

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <cstdlib>
  5 #include <cmath>
  6 #include <algorithm>
  7 #define LL __int64
  8 const int maxn = 100+10;
  9 using namespace std;
 10 int equ, var, fn;
 11 int a[maxn][maxn], x[maxn];
 12 bool free_x[maxn];
 13
 14 int gcd(int a, int b)
 15 {
 16     return b==0?a:gcd(b, a%b);
 17 }
 18 int lcm(int a, int b)
 19 {
 20     return a*b/gcd(a, b);
 21 }
 22 int Gauss()
 23 {
 24     int i, j, k, max_r, col;
 25     int ta, tb, LCM, tmp, fx_num;
 26     int free_index;
 27     col = 0;
 28
 29     for(k = 0; k<equ && col<var; k++, col++)
 30     {
 31         max_r = k;
 32         for(i = k+1; i < equ; i++)
 33             if(abs(a[i][col])>abs(a[max_r][col]))
 34             max_r = i;
 35
 36         if(max_r != k)
 37             for(j = k; j < var+1; j++)
 38             swap(a[k][j], a[max_r][j]);
 39
 40         if(a[k][col]==0)
 41         {
 42             k--;
 43             continue;
 44         }
 45         for(i = k+1; i < equ; i++)
 46         {
 47             if(a[i][col] != 0)
 48             {
 49                 LCM = lcm(abs(a[i][col]), abs(a[k][col]));
 50                 ta = LCM/abs(a[i][col]);
 51                 tb= LCM/abs(a[k][col]);
 52                 if(a[i][col]*a[k][col] < 0) tb = -tb;
 53
 54                 for(j = col; j < var+1; j++)
 55                 a[i][j] = a[i][j]*ta - a[k][j]*tb;
 56             }
 57         }
 58     }
 59     for(i = k; i < equ; i++)
 60     if(a[i][col] != 0)
 61     return -1;
 62
 63     if(k < var)
 64     {
 65         for(i = k-1; i >= 0; i--)
 66         {
 67             fx_num = 0;
 68             for(j = 0; j < var; j++)
 69                 if(a[i][j]!=0 && free_x[j])
 70                 {
 71                     fx_num ++;
 72                     free_index = j;
 73                 }
 74             if(fx_num > 1) continue;
 75
 76             tmp = a[i][var];
 77             for(j = 0; j < var; j++)
 78                 if(a[i][j] != 0 && j!=free_index)
 79                 tmp -= a[i][j]*x[j];
 80
 81             x[free_index] = tmp/a[i][free_index];
 82             free_x[free_index] = 0;
 83         }
 84         return var-k;
 85     }
 86     for(i = var-1; i >= 0; i--)
 87     {
 88         tmp = a[i][var];
 89         for(j = i+1; j < var; j++)
 90         if(a[i][j] != 0)
 91         tmp -= a[i][j]*x[j];
 92
 93         if(tmp%a[i][i] != 0) return -2;
 94         x[i] = tmp/a[i][i];
 95     }
 96     return 0;
 97 }
 98 int main()
 99 {
100     int i, j;
101     while(cin>>equ>>var)
102     {
103         memset(a, 0, sizeof(a));
104         memset(x, 0, sizeof(x));
105         memset(free_x, 1, sizeof(free_x));
106         for(i = 0; i < equ; i++)
107         {
108             for(j = 0; j < var+1; j++)
109             cin>>a[i][j];
110         }
111
112         fn = Gauss();
113         if(fn == -1) cout<<"无解"<<endl;
114         else if(fn == -2)
115         cout<<"有浮点数解, 无整数解"<<endl;
116         else if(fn > 0)
117         {
118             printf("无穷多解! 自由变元个数为%d\n", fn);
119             for(i = 0; i < var; i++)
120             {
121                 if(free_x[i]) printf("x%d行 是不确定的\n", i + 1);
122                 else printf("x%d: %d\n", i + 1, x[i]);
123             }
124         }
125         else
126         {
127             for(i = 0; i < var; i++)
128             printf("x%d: %d\n", i + 1, x[i]);
129         }
130         cout<<endl;
131     }
132     return 0;
133 }

高斯消元 模板,布布扣,bubuko.com

时间: 2024-10-26 00:02:17

高斯消元 模板的相关文章

高斯消元模板(kuangbin大神版本)

#include<stdio.h> #include<algorithm> #include<iostream> #include<string.h> #include<math.h> using namespace std; const int MOD = 7; const int MAXN = 50; int a[MAXN][MAXN];//增广矩阵 int x[MAXN];//解集 bool free_x[MAXN];//标记是否是不确定的

HDU 3359 高斯消元模板题,

http://acm.hdu.edu.cn/showproblem.php?pid=3359 题目的意思是,由矩阵A生成矩阵B的方法是: 以a[i][j]为中心的,哈曼顿距离不大于dis的数字的总和 / 个数,就是矩阵B的b[i][j] 现在给出B,要求A 那么我们设A矩阵为a[1][1], a[1][2], a[1][3]..... 那么对于每一个b[i][j]我们有b[i][j] = (a[1][1] + a[1][2] + ... + ) / cnt 所以这样可以建议一条方程,然后guas

高斯消元模板

高斯消元: 其实就是用矩阵初等变换解线性方程组,只是他要求每次选取的主元一定要是最大值. 模板 #include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> using namespace std; const int MAXN=10000; int a[MAXN][MAXN];//增广矩阵 int x[MAXN];//解集 bool free_x[MAXN];/

【Luogu】P3389高斯消元模板(矩阵高斯消元)

题目链接 高斯消元其实是个大模拟qwq 所以就着代码食用 首先我们读入 for(int i=1;i<=n;++i) for(int j=1;j<=n+1;++j) scanf("%lf",&s[i][j]); 读入肯定没什么问题(不过我在这卡了一分多钟) 然后我们要进行消元操作 所谓消元操作其实就是对于输入的矩阵 比如说 9 3 2 2 1 4 7 3 1 3 4 5 进行一番乱搞,使得第当前枚举的(比如说枚举第i行第i列)s[i][j]系数变成1. 实际上就是整行

【转】高斯消元模板 by kuangbin

写的很好,注释很详细,很全面. 原blog地址:http://www.cnblogs.com/kuangbin/archive/2012/09/01/2667044.html #include<stdio.h> #include<algorithm> #include<iostream> #include<string.h> #include<math.h> using namespace std; const int MAXN=50; int

高斯消元模板,整数(数学)

线性代数,原理不讲了... 1 /* 用于求整数解得方程组. */ 2 3 #include <iostream> 4 #include <string> 5 #include <cmath> 6 using namespace std; 7 8 const int maxn = 105; 9 10 int equ, var; // 有equ个方程,var个变元.增广阵行数为equ, 分别为0到equ - 1,列数为var + 1,分别为0到var. 11 int a[

高斯消元模板(pascal)

洛谷P3389评测 1 program rrr(input,output); 2 const 3 eps=1e-8; 4 var 5 a:array[0..110,0..110]of double; 6 n,i,j,k:longint; 7 t:double; 8 begin 9 assign(input,'r.in');assign(output,'r.out');reset(input);rewrite(output); 10 readln(n); 11 for i:=1 to n do f

【洛谷P3389】【模板】高斯消元

题目链接 题目描述 给定一个线性方程组,对其求解 输入输出格式 输入格式: 第一行,一个正整数 n 第二至 n+1行,每行 n+1 个整数,为a1, a2 .....an? 和 b,代表一组方程. 输出格式: 共n行,每行一个数,第 i行为 xi? (保留2位小数) 如果不存在唯一解,在第一行输出"No Solution". 输入输出样例 输入样例#1: 3 1 3 4 5 1 4 7 3 9 3 2 2 输出样例#1: -0.97 5.18 -2.39 说明 1≤n≤100,∣ai?

BZOJ 1013 JSOI2008 球形空间产生器sphere 高斯消元

题目大意:给定n维空间下的n+1个点,求这n个点所在的球面的球心 曾经尝试了很久的模拟退火0.0 至今仍未AC 0.0 今天挖粪涂墙怒学了高斯消元-- 我们设球心为X(x1,x2,...,xn) 假设有两点A(a1,a2,...,an)和B(b1,b2,...,bn) 那么我们可以得到两个方程 (x1-a1)^2+(x2-a2)^2+...+(xn-an)^2=r^2 (x1-b1)^2+(x2-b2)^2+...+(xn-bn)^2=r^2 这些方程都是二次的,无法套用高斯消元 但是我们可以做