生活随笔
收集整理的這篇文章主要介紹了
【模板】高斯消元
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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)
#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
;if(fabs(a
[t
][c
])<eps
) continue;for(int i
=c
;i
<=n
;i
++) swap(a
[r
][i
],a
[t
][i
]);for(int i
=n
;i
>=c
;i
--) a
[r
][i
]/=a
[r
][c
];for(int i
=0;i
<n
;i
++)if(i
!=r
&&fabs(a
[i
][c
])>eps
) for(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; return 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
; for(int i
=r
;i
<n
;i
++)if(a
[i
][c
]) t
=i
;if(!a
[t
][c
]) continue; for(int j
=c
;j
<=n
;j
++) swap(a
[r
][j
],a
[t
][j
]);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
nnn行mmm列,即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
;
}
總結
以上是生活随笔為你收集整理的【模板】高斯消元的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。