ZJOI2007 矩陣遊戲(匈牙利)

2022-03-26 22:01:06 字數 1350 閱讀 9675

題幹:

行交換操作:選擇矩陣的任意兩行,交換這兩行(即交換對應格仔的顏色)

列交換操作:選擇矩陣的任意行列,交換這兩列(即交換對應格仔的顏色)

遊戲的目標,即通過若干次操作,使得方陣的主對角線(左上角到右下角的連線)上的格仔均為黑色。對於某些關卡,小q百思不得其解,以致他開始懷疑這些關卡是不是根本就是無解的!於是小q決定寫乙個程式來判斷這些關卡是否有解。  

題解:

其實這道題我們手模幾個滿足題幹的狀態就可知:每一縱列與每一橫行的交點(1)一定是獨一無二的。

0  0  0  1      0  1  0  0

1  0  0  0      1  0  0  0

0  0  1  0      0  0  0  1

0  1  0  0      0  0  1  0

(上表其餘位置均可填1)

比較容易(太難了!!)就可以想到:每個黑點所對應的橫縱座標(x,y)所對應的就是乙個二分圖。

我們觀察這兩個表:每個點的橫豎都沒有黑點(1),或者說,其餘的黑點對最終結果不造成任何影響(包括好的或壞的)。

當橫縱座標的值存在一一匹配的情況,就一定有解。

那就用匈牙利演算法來解決好了。(都快忘了。。。)

code:

1 #include2 #include3 #include4 #include5

#define $ 222

6using

namespace

std;

7int

b[$][$],m,n,ans,t,sum,first[$],tot,start[$];

8bool

judge[$];

9struct treea[$*$];

10 inline void add(int x,int

y);12 first[x]=tot;

13/*

a[++tot]=(tree);

14first[y]=tot;

*/15

}16 inline bool km(int

x)22}23

return0;

24}25 inline void

work()

37if(sum"

no"); return

; }

38for(register int i=1;i<=n;++i)

42 ans==n?puts("

yes"):puts("no"

);43}44

signed main()

view code

ZJOI2007 矩陣遊戲

霧。既然我們要求每行每列都要有乙個 1 那麼我們就可以這樣進行建立了這個二分圖。左邊有 n 個點,代表行,右邊有 n 個點,代表列。做這題的主要目的是打板子 二分圖匹配用的dinic bzoj 1059 這裡寫鏈結內容 include include include include include ...

ZJOI2007 矩陣遊戲

我們發現同行同列的點無論經過多少次變換仍然同行或同列,所以題目可轉換為能不能找到n個互相不同行或同列的點。那麼我們用二分圖求一下最大匹配即可。include using namespace std const int n 205 int t,n,x,ans int match n 1 bool vi...

ZJOI2007 矩陣遊戲

這道題是乙個不錯的題,難點就在於建模。交換操作過程中,同一行的黑塊是不會被拆開,同理縱塊也是。接著目標狀態就是一條對角線上全都是黑塊。我們倒過來想,看看能否從目標狀態變成初始狀態。對於所有的黑塊 x,y 左邊行右邊列,點分行列 我們連條邊 x leftarrow rightarrow y 顯然目標狀...