poj 1830 開關問題 高斯消元

2021-07-04 15:11:34 字數 1984 閱讀 8608

一,題意:

該題是中文提,題意我就不解釋了。

二,解析:

該題我們先的建立乙個圖,我們以開關為節點,若開關x的變化會影響y開關,則連一條x到y的有向邊。

然後我們用鄰接矩陣來儲存該圖。則鄰接矩陣中0表示不影響,1表示反轉。

例如:樣例一, 開始狀態為 :begin = [ 0  0   0 ]    最終狀態為:end = [ 1  1  1 ]    圖的矩陣為:

對角線為1的原因是當你改變某乙個節點是除了與他相鄰的節點要反轉外,其自身也要變。

將矩陣每一列想象為乙個開關按下後產生的效果(1表示狀態翻轉,0表示不變)

即:將每一列最上面想象有乙個開關,如圖

其中x1,x2,x3  只能取  0或1,因為取2的效果與取0的效果是一樣的。

x1=1表示將開關1取反。  x1=0表示不對開關1做操作。

所以我要求的就是 [ x1   x2   x3]有多少種情況。

我們令:x=[ x1,x2,x3 ]。關係矩陣  a=[ a1,a2,a3 ]。a1為列向量。

由上面公式可知,b1為開關1的變化次數,b2為開關2變化次數。

而起點 begin 到終點 end 的變化就是  begin^end 即 begin ^ end = b

所以就是解線性方程組(如圖):求期解的個數。

解該方程 我們用到高斯消元演算法,至於高斯消元就是利用矩陣來解方程組,但是每次

被選取為主元的是一定是最大值。這是為了減少誤差。至於利用矩陣來解方程是線性代數

上的內容,,這裡就不多說。

**:

#include #include #include using namespace std;

int b[35];//狀態變化陣列

int a[35][35];//運算的矩陣

void gaussian(int n)

{//對n*(n+1)的增廣矩陣做初等行變換

for (int r=0,col=0; r

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...