高斯消元小結(貼一些模板)

2022-08-05 18:12:19 字數 2697 閱讀 9149

依舊是跟著hihocoder學習高斯消元,以前只是知道,並不會寫,現在感覺寫起來還是比較簡單的,其實就是一個線性代數的知識。(我記得今年好像做到過一道高斯消元的題,比較隱蔽的方程組,然後隊友最後想到了,然而並沒有時間寫完,結束以後也並沒有補一下高斯消元)。

高斯消元關鍵就是一個倒三角形吧,然後判斷是無窮解,無解,唯一解的的條件就是矩陣的秩與n(元的個數)的關係:

n元方程組 ax = b 解的情況和r(a),r(a,b),n有關。

無解: r(a) < r(a,b)

唯一解:r(a) == r(a,b) == n

無窮解:r(a) == r(a,b) < n

具體實現方法可以看程式,(然而我覺得hihocoder的偽**寫得很不錯)。

然後是異或方程組,這裡有一個很重要的異或公式 a xor b == c 等價於 b == a xor c,其實這裡很好理解。

異或方程可以表示為 初始狀態 xor (a[i][1] * x[1]) xor (a[i][2] * x[2]) xor ... xor (a[i][n]*x[n]) == c[i] 這個時候可以轉化成:(a[i][1] * x[1]) xor (a[i][2] * x[2]) xor ... xor (a[i][n]*x[n]) == c[i] xor 初始狀態。搞定

異或方程組的消元是利用了 1^1 == 0來做的,但是這個消元的時候要注意,1^0 == 1,也就是在消元的時候不能呆頭呆腦地直接搞,遇到這個a[j][i] == 0了,直接跳過就好了。

下面貼一下模板:

高斯消元:

#include #include #include #include #include #include #include #include #define for(i,x,y)  for(int i = x;i < y;i ++)

#define ifor(i,x,y) for(int i = x;i > y;i --)

#define ll long long

#define n 550

#define m 1100

using namespace std;

const double eps = 1e-6;

int n,m;

double a[m][n],c[m],b[n],val[n];

bool zero(double x)

void swap(int i,int j)

double tem = c[i];

c[i] = c[j];

c[j] = tem;

}int guass()

}if(!flag)

for(j,i+1,m+1)

c[j] = c[j] - c[i]*tem;}}

for(i,1,m+1)

}if(flag && !zero(c[i]))

}if(manysolution)

return 1;

ifor(i,n,0)

c[j] = c[j] - c[i]*tem;

}val[i] = c[i]/a[i][i];

}return 0;

}int main()

int tem = guass();

if(tem == -1) printf("no solutions\n");

else if(tem == 1) printf("many solutions\n");

else}}

return 0;

}

異或方程組:

#include #include #include #include #include #include #include #define ll long long

#define for(i,x,y) for(int i = x;i < y;i ++)

#define ifor(i,x,y) for(int i = x;i > y;i --)

#define n 35

using namespace std;

const double eps = 1e-6;

char str[10];

int a[n][n],c[n],val[n],ans[n];

void init()

}void swap(int i,int j)

int tem = c[i];

c[i] = c[j];

c[j] = tem;

}int guass()

}for(j,i+1,30)

c[j] = c[i] ^ c[j];

}if(!flag)

}for(i,0,30)

if(flag && c[i]) return -1;

}if(manysolutions) return 1;

ifor(i,29,-1)

c[j] = c[j] ^ c[i];

}val[i] = c[i];

}return 0;

}int main()

for(i,1,5)

}memset(val,0,sizeof(val));

init();

guass();

int cnt = 0;

for(i,0,30)

printf("%d\n",cnt);

for(i,0,cnt)

}return 0;

}

高斯消元 模板

高斯消 元高斯消 元 高斯消元是用來解線性方程組的一種 o n 3 o n3 演算法 按順序列舉未知數x x 在沒有使用過的方程中選出 x x 係數最大的方程 為了減少誤差 將其移動到 i i 行 將該方程係數化一 使用該方程對沒有使用過的方程進行消元 最後得到上三角矩陣 將最後一個未知數迴帶即可解出...

高斯消元法 模板

高斯消元法,消成行階梯型矩陣。 下面兩種消元法的時間複雜度都是 o n 3 includeusing namespace std const int maxn 100 10 typedef double matrix maxn maxn 要求係數矩陣可逆 這裡的a是增廣矩陣,即a i n 是第i個方...

LG3389 模板 高斯消元法 高斯消元

lg3389 高斯消元,是用來解 n 元一次方程組的演算法,時間複雜度 o n 3 這樣就構造出了這個方程組的矩陣 目標就是把這個矩陣左邊...