POJ 1830 開關問題(高斯消元)

2022-05-12 01:15:52 字數 2362 閱讀 9203

高斯消元無解的條件:當存在非法的左式=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;

#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

sample output

4

oh,it's impossible~!!

hint

第一組資料的說明: 

一共以下四種方法: 

操作開關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...