日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【模板】高斯消元

發布時間:2023/12/3 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【模板】高斯消元 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ACM模板


目錄

      • 高斯消元解線性方程組
      • 異或方程組
      • bitset優化異或方程組

高斯消元解線性方程組

int a[N][N]輸入矩陣,nnn行,n+1n+1n+1列,下標從0開始
n+1n+1n+1列表示方程右邊的值(n行即n個方程,n列即n個未知數)

int gauss()返回矩陣的秩(矛盾無解返回-1),并且系數矩陣化為單位矩陣
int a[N][N]數組第n+1n+1n+1列(下標a[i][n])是解xix_ixi?

時間復雜度:O(n3)O(n^3)O(n3)

//O(n^3) #include<bits/stdc++.h> using namespace std; const int N=110; const double eps=1e-6; int n; double a[N][N]; int gauss() {int c,r;for(c=0,r=0;c<n;c++) //枚舉每一列{ //找該列絕對值最大的一行 精度int t=r;for(int i=r;i<n;i++)if(fabs(a[i][c])>fabs(a[t][c])) t=i;// 該列都為0 則跳過if(fabs(a[t][c])<eps) continue;// 將該行換到第r行for(int i=c;i<=n;i++) swap(a[r][i],a[t][i]);// 第r行第一項變成1for(int i=n;i>=c;i--) a[r][i]/=a[r][c];// 變成上三角 用第r行去消掉其他所有行的第c列for(int i=0;i<n;i++)if(i!=r&&fabs(a[i][c])>eps) //該行第c列不為0for(int j=n;j>=c;j--)a[i][j]-=a[i][c]*a[r][j];r++;}if(r<n) //非完美階梯型{for(int i=r;i<n;i++)if(a[i][n]>eps) return -1; // 等式右端不為0return r; //返回秩}return r; }

異或方程組

n+1n+1n+1列表示方程右邊的值(n行即n個方程,n列即n個未知數)
int gauss返回矩陣的秩

時間復雜度:O(n3)O(n^3)O(n3)

#include<iostream> using namespace std; const int N=110; int n,a[N][N]; int gauss() {int r,c;for(c=0,r=0;c<n;c++) //枚舉列{int t=r; //找到不為1的那一行for(int i=r;i<n;i++)if(a[i][c]) t=i;if(!a[t][c]) continue; //該列都是0// 不為1的一行換到第r行for(int j=c;j<=n;j++) swap(a[r][j],a[t][j]);// 異或消 第r行消去他們的第c列for(int i=0;i<n;i++)if(i!=r&&a[i][c])for(int j=n;j>=c;j--)a[i][j]^=a[r][j];r++;}if(r<n){for(int i=r;i<n;i++)if(a[i][n]) return -1;return r;}return r; }

bitset優化異或方程組

bitset的原理大概是將很多數壓成一個,從而節省空間和時間,時間復雜度的www通常是32

nnnmmm列,即nnn個方程mmm個未知數
int gauss返回矩陣的秩
注意bitset對于字符串第位在前,而數字第位表示二進制中數字的最低二進制位

時間復雜度:O(n3w)O(\frac{n^3}{w})O(wn3?)

#include<bitset> using namespace std; const int N=1010; bitset<N> A[N]; int n,m; int gauss() {int r,c;for(c=0,r=0;c<m;c++){int t=r;for(int i=r;i<n;i++)if(A[i][c]) t=i;if(!A[t][c]) continue;swap(A[r],A[t]);for(int i=0;i<n;i++)if(i!=r&&A[i][c])A[i]^=A[r];r++;}if(r<m){for(int i=r;i<n;i++)if(A[i][m]) return -1;return r;}return r; }

總結

以上是生活随笔為你收集整理的【模板】高斯消元的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。