高斯消元入門筆記

2022-06-23 19:15:08 字數 3419 閱讀 2189

目錄【例題】

【矩陣樹入門】

【總結】

高斯消元是一種解線性方程組的方法。

通過初等行變換把增廣矩陣變為簡化階梯型矩陣的線性方程組求解演算法就是高斯消元演算法

值得一提的是有一種名為高斯—約旦消元法的方法,可以將階梯型矩陣進一步化簡。

通常這種方法實現更簡單,**常數更小,精度誤差更小,更為通用。

板子題

解一個線性方程組。

高斯—約旦消元法大致思路如下:

選擇一個尚未被選過的未知數作為主元,選擇一個包含這個主元的方程。

將這個方程主元的係數化為1。

通過加減消元,消掉其它方程中的這個未知數。

重複以上步驟,直到把每一行都變成只有一項有係數。

在消元完成之後,一定為三種情況之一:

若存在係數全部為 \(0\) 但常數不為 \(0\) 的項,方程組無解。

若係數不為 \(0\) 的行恰好有 \(n\) 個,說明方程恰好有 \(1\) 個解。

若係數不為 \(0\) 的行有 \(k個,說明主元有 \(k\) 個,自由元有 \(n-k\) 個,方程有無數多個解。

同時為了保留精度,我們通常使用所有可選主元中最大的那一個進行消元,可以證明這樣精度誤差最小。

每次列舉找到最大的對應元,然後消元。

時間複雜度 \(o(n^3)\)。

int n;

double a[110][110];

const double eps = 1e-8;

int main()

for(int j=1; j<=n; j++)

}for(int i=1; i<=n; i++)

printf("%.2lf\n", a[i][n+1] / a[i][i]);

return 0;

}

異或的本質是不進位加法,所以同樣可以用高斯消元處理。

方法和結果和上述一模一樣,這裡只是提一句。

球形空間產生器

給定 \(n\) 維座標內的 \(n+1\) 個點,求使 \(n+1\) 個點共球的球心位置,資料保證有且僅有一個解。

距離:設兩個 \(n\) 維空間上的點 \(a,b\) 的座標為 \((a_1, a_2, \cdots , a_n), (b_1, b_2, \cdots , b_n)\)則ab的距離定義為:

\[dist = \sqrt

\]

我們的目標是求一個座標 \((x_1,x_2,\cdots,x_n)\) 使:

\[\sum_^n (a_-x_j)^2=c(1\leq i\leq n+1)

\]其中 \(c\) 為常數。

容易看出這並不是一個線性方程組,無法使用高斯消元處理。

但是如果將相鄰方程作差,我們不難得到一個 \(n\times n\) 的線性方程組:(\(1\leq i\leq n\))

\[\sum_^n (a_-x_j)^2-\sum_^n (a_-x_j)^2=0

\]\[\sum_^n (a_^2+x_j^2-2\times a_\times x_j)-\sum_^n (a_^2+x_j^2-2\times a_\times x_j)=0

\]\[\sum_^n(a_^2-a_^2-2x_j\times(a_+a_))=0

\]\[\sum_^n 2(a_+a_)\times x_j=\sum_^na_^2-a_^2

\]上式中除了 \(x\) 之外都是常數,於是我們得到了 \(n\times n\) 的線性方程組。

消元即可。

int n;

double a[20][20];

double f[20][20];

int main()

for(int i=1; i<=n; i++)

}for(int i=1; i<=n; i++) printf("%.3lf ", f[i][n+1] / f[i][i]);

return 0;

}

開關問題

有 \(n\) 個開關和 \(k\) 個關係有序對,關係 \((i,j)\) 表示改變開關 \(i\) 時 \(j\) 的狀態同時改變。

對於任意一個開關,最多隻能進行一次開關操作,計算有多少種可以達到指定狀態的方法。

前文已經提到過,異或方程組同樣可以使用高斯消元,只是將加減消元改變為異或操作。

值得注意的是通常運用高斯消元解異或方程組時,可以將每一行狀態壓縮至一個intbitset,便於操作。

主要**如下:

int n,a[50];

int main()

if(a[i] == 1)

for(int k=n; k>=1; k--)

if(a[i] & (1《外星千足蟲

給定 \(m\) 個從 \(n\) 個數中挑選某些數求和後和的奇偶性,求解 \(n\) 個數的奇偶性。

如果有解,輸出解。同時如果只需要 \(m\) 個條件中的前 \(k\) 個就能夠確定解,則輸出 \(k\)。

類似於上題的解異或方程組,但是還要記錄一個 \(k\)。

可以發現在高斯消元的同 時,我們自上而下找到的第一個主元就是最小的。

\(k\) 的取值在所有條件中取 \(\max\) 即可。

可惜時間複雜度 \(o(n^3)\) 好像不太行,利用bitset優化到 \(o(\frac)\),實測能過。

int n, m;

char s[n];

bitseta[m];

int main()

for(int i=1; i<=m; i++)

int ans = 0;

for(int i=1; i<=n; i++)

ans = max(ans, k);

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

for(int j=1; j<=m; j++)

if(j != i && a[j][i]) a[j] ^= a[i];

} printf("%d\n", ans);

for(int i=1; i<=n; i++)

if(a[i][n+1]) puts("?y7m#");

else puts("earth");

return 0;

}

矩陣樹定理是高斯消元的一大運用。

坑留在這裡:matrix tree定理入門筆記。

高斯消元題目的難度通常體現在問題的轉化上。

轉化為高斯消元后,題目通常變得無腦起來。

引用資料&特別鳴謝:

《演算法競賽進階指南》。

高斯消元模板題解。

完結撒花

高斯消元法

高斯消元法。直接附 了,這個 沒有迴帶的。 1 writer hsz wjmzbmr tourist hzwer 2 include3 in...

高斯消元 模板

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

系列 高斯消元

bzoj 1013 題目大意 給出 n 維球體上的 n 1 個點,求球心 思路 設球心座標 x 1 x 2 x 3 cdots x n 則對於任意兩個點 a 1 a 2 cdots a n b 1 b 2 cdots b n ,得到 x 1 a 1 2 x 2 a 2 2 cdots x n a n...