高斯消元無解的條件:當存在非法的左式=0而右式不等於0的情況,即為非法。這個可以在消元後,對沒有使用過的方程驗證是否右式不等於0(此時因為前邊消元一定會使得後邊的方程左式為0)
高斯消元自由變元:自由變元就是當這些未知量一旦確定,整個方程就確定了。但是這些量是未知的。(例如x+y=5,自由變元就是1,因為無論是x還是y確定,另乙個就能唯一確定),而答案要求的是方案,那麼顯然因為自由變元是可以隨便賦值的,而這些值只有2個,開和不開,那麼方案數就是2^自由變元。而自由變元的求法很簡單,具體解釋看白書,其實就是僅當n個不同的方程(就是無論怎麼通過其它方程都不會將這兩個方程變成一樣)才能確定n個解。那麼我們如果只確定了x個方程,那麼自由變元的數量就是n-x。(這個x可以輕易得到,因為在高斯消元過程中,會消元,而消元會將相同的方程消成這個樣子:0=0。那麼這個就是沒用的方程。
而高斯消元我們要在原有的求一定有解的高斯消元演算法改動一下。
我們記錄當前的方程x和當前的未知數y,我們知道只有在所有a行,a>=x有a[a][y]!=0時,那麼就可以消元,消元後這個方程就是確定的了,那麼x++;反之不存在這個a,那麼未知數y++
還有乙個要注意的是,我們建圖時,如果初始狀態和末狀態相等,意味著這個未知量不需要改變,即a[i][n+1]=0,反之a[i][n+1]=1。且每乙個方程組x,如果有未知量y能夠造成未知量x改變,那麼a[x][y]=1(所以這點千萬不要在建圖的時候弄錯了!)
#include #include #include #include #include #include #include using namespace std;sample output#define rep(i, n) for(int i=0; i<(n); ++i)
#define for1(i,a,n) for(int i=(a);i<=(n);++i)
#define for2(i,a,n) for(int i=(a);i<(n);++i)
#define for3(i,a,n) for(int i=(a);i>=(n);--i)
#define for4(i,a,n) for(int i=(a);i>(n);--i)
#define cc(i,a) memset(i,a,sizeof(i))
#define read(a) a=getint()
#define print(a) printf("%d", a)
#define dbg(x) cout << (#x) << " = " << (x) << endl
#define printarr2(a, b, c) for1(_, 1, b)
#define printarr1(a, b) for1(_, 1, b) cout << a[_] << '\t'; cout << endl
inline const int getint()
inline const int max(const int &a, const int &b)
inline const int min(const int &a, const int &b) { return adescription
有n個相同的開關,每個開關都與某些開關有著聯絡,每當你開啟或者關閉某個開關的時候,其他的與此開關相關聯的開關也會相應地發生變化,即這些相聯絡的開關的狀態如果原來為開就變為關,如果為關就變為開。你的目標是經過若干次開關操作後使得最後n個開關達到乙個特定的狀態。對於任意乙個開關,最多只能進行一次開關操作。你的任務是,計算有多少種可以達到指定狀態的方法。(不計開關操作的順序)
input
輸入第一行有乙個數k,表示以下有k組測試資料。
每組測試資料的格式如下:
第一行 乙個數n(0 < n < 29)
第二行 n個0或者1的數,表示開始時n個開關狀態。
第三行 n個0或者1的數,表示操作結束後n個開關的狀態。
接下來 每行兩個數i j,表示如果操作第 i 個開關,第j個開關的狀態也會變化。每組資料以 0 0 結束。
output
如果有可行方法,輸出總數,否則輸出「oh,it's impossible~!!」 不包括引號
sample input
230 0 0
1 1 1
1 21 3
2 12 3
3 13 2
0 03
0 0 0
1 0 1
1 22 1
0 0
4hintoh,it's impossible~!!
第一組資料的說明:
一共以下四種方法:
操作開關1
操作開關2
操作開關3
操作開關1、2、3 (不記順序)
source
liangliang@poj
POJ 1830 開關問題 高斯消元
開關問題 time limit 1000ms memory limit 30000k total submissions 3390 accepted 1143 description 有n個相同的開關,每個開關都與某些開關有著聯絡,每當你開啟或者關閉某個開關的時候,其他的與此開關相關聯的開關也會相應...
poj 1830 開關問題 高斯消元
題意是 給一些開關的初始狀態 0 或1 在給出終止狀態,在給出相關的變化規則,規則 x 變化 則 y 也變 x y 讀入。輸出有多少種開關的撥動情況,使初始狀態變成終止狀態。此問題 很容易轉化成 高斯消元 解 異或方程組。t 方程組的自由化的個數,則結果就是 2 t include include ...
poj 1830 開關問題(高斯消元)
終止狀態是從初始狀態由開關組合影響而形成的,那麼就有乙個等式使得初始狀態可以到達終止狀態,例如a,b,c三個開關 e a xa mp a a xb mp a b xc map a c s a e b xa mp b a xb mp b b xc map b c s b e c xa mp c a x...