luogu2455 [SDOI2006]线性方程组

题目链接

solution

高斯消元模板。

特别的地方在于判断无解和无穷解。

无解就是出现前面全是0,最后一个为0.

无穷解就是一列全是0。

先判断无解,在判断无穷解

一开始看很多人在这里踩坑,还暗自窃喜自己想到了

然鹅还是踩了好几次坑。

一定要在高斯消元之后判断是否无解!!!!

一定要先判断是不是无解!!!

code

/*
* @Author: wxyww
* @Date:   2020-04-27 09:07:38
* @Last Modified time: 2020-04-27 09:57:23
*/
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#include<ctime>
using namespace std;
typedef long long ll;
const int N = 60;
ll read() {
	ll x = 0,f = 1;char c = getchar();
	while(c < '0' || c > '9') {
		if(c == '-') f = -1; c = getchar();
	}
	while(c >= '0' && c <= '9') {
		x = x * 10 + c - '0'; c = getchar();
	}
	return x * f;
}
double a[N][N];
int n,FLAG;
void NoSolution() {
	for(int i = 1;i <= n;++i) {
		int flag = 0;
		for(int j = 1;j <= n;++j) {
			if(fabs(a[i][j]) > 1e-8) {
				flag = 1;break;
			}
		}
		if(!flag && fabs(a[i][n + 1]) > 1e-8) {puts("-1");exit(0);}
		else if(!flag) {FLAG = 1;}
	}
	// puts("0");exit(0);
}
void Guass() {

	for(int i = 1;i <= n;++i) {
		int k = i;
		for(int j = i + 1;j <= n;++j) 
			if(a[j][i] > a[k][i]) k = j;
	
		if(fabs(a[k][i]) <= 1e-8) continue;

		swap(a[k],a[i]);

		for(int j = 1;j <= n;++j) {
			if(i == j) continue;
			double tmp = a[j][i] / a[i][i];
			// cout<<tmp<<endl;
			for(int t = i;t <= n + 1;++t) {
				a[j][t] -= a[i][t] * tmp;
			} 
		}
	}
}

int main() {
	n = read();
	for(int i = 1;i <= n;++i)
		for(int j = 1;j <= n + 1;++j)
			a[i][j] = read();

	Guass();
	NoSolution();
	if(FLAG) {
		puts("0");return 0;
	}
	for(int i = 1;i <= n;++i)
		printf("x%d=%.2lf\n",i,a[i][n + 1] / a[i][i]);
	return 0;
}
posted @ 2020-04-27 10:16  wxyww  阅读(194)  评论(0编辑  收藏  举报