对于要区分无穷解和无解的情况, 要先判断是否存在至少一个方程无解, 确定都有解之后再判断是否有无穷解, 因为如果有必须所有方程都有解, 整个方程组才有解, 而只要有一个方程有无穷解, 并且方程组有解, 那么方程组就有无穷解
容易Hack的数据:
Input :
6
1 2 3 4 5 6 10
0 0 1 2 3 4 15
0 0 0 2 6 7 30
0 0 0 0 6 8 10
0 0 0 0 0 1 30
0 0 0 0 0 0 0
Output :
0
和
Input:
2
0 2 3
0 0 0
Output:
0
为了不被Hack, 要在代码里加这么一行
bool jdswap(int ri, int x, int y) {
if (fabs(fabs(a[x][ri]) - fabs(a[y][ri])) > eps) return fabs(a[x][ri]) > fabs(a[y][ri]) + eps;
for (int i = ri + 1; i <= n; ++i)
if (fabs(fabs(a[x][i]) - fabs(a[y][i])) > eps) return fabs(a[x][i]) + eps < fabs(a[y][i]);
return false;
}
其中, jdswap()表示要不要把原本在当前行(ri)行的 y 行 和 x 行互换, 其中 fabs() 和 eps(eps = 1e-16)是用来确定精度的
可以发现, jdswap()函数就是用于防止上面两种这样当前列都是0, 但是有一个在之后的列里不是0, 而其他在那一列里都是0的情况
B.T.W, LG P3389 的数据好水……(就是拿着P3389的代码去过P2455, 结果调半天调出一堆错误), 高消去 LG P2455
原文:https://www.cnblogs.com/-wxyz/p/12755598.html