bzoj2437 兔兔與蛋蛋

2022-06-07 15:30:15 字數 1115 閱讀 7072

移動可以理解為空白格的移動,問題等價於雙方在一張無向圖(相鄰不同色點連邊,起點視為黑色)移動,不能經過重複的點,無法移動者為負

由於這張圖是二分圖,因此有結論,先手必勝當且僅當起點一定在任意一組最大匹配中

證明:必要性,即先手必勝=>一定在匹配中,其等價於不在匹配中=>後手必勝,考慮一組最大匹配,容易發現先手所走到的點一定在最大匹配中(否則匹配可以增大),而後手的策略就是一直走到那個點的匹配上,一定必勝

充分性,即一定在匹配中=>先手必勝,那麼當去掉起點後的最大匹配中,一定存在某乙個點使得其可以不在剩下點的最大匹配中,即這個點後手必勝,那麼先手走到這個點即可

具體實現就是說先將其他節點的最大匹配求出,然後再加入這個節點判斷能否增大,每一步都只需要重新判斷新的空格即可

(其實這個東西就是說讓答案+1即存在一條增廣路,而增廣路一定是奇數條邊,所以差不多就是這樣了)

1 #include2

using

namespace

std;

3#define n 2005

4struct

jiedge[n<<3];7

int e,n,m,k,x,y,dx[4]=,dy[4]=,a[n],vis[n],ans[n],mat[n],head[n];

8char s[105][105];9

int id(int x,int

y)12

void add(int x,int

y)18

int dfs(int

k)28}29

return0;

30}31int

main()

43for(int i=0;i)

44for(int j=0;j)

49if (s[i][j]!='o'

)53}54 scanf("

%d",&k);

55for(int i=0;i

64if ((i&1)&&(a[i-1])&&(a[i]))ans[++ans[0]]=i/2+1;65

}66for(int i=0;i<=ans[0];i++)printf("

%d\n

",ans[i]);

67 }

view code

bzoj2437 Noi2011 兔兔與蛋蛋

先把棋盤黑白染色,那麼對於o,當且僅當它所處的格仔顏色和空格不一樣才會移動,x相似,那麼對於這些o x,最多也就是被移動1次而已。同時每次空格每次移動所處顏色都是在改變 那麼就是二分圖博弈啊。而走一步相當於刪除乙個點,然後每次就讓被刪的那個點去找增廣路,找到了就必敗,反之必勝。蛋蛋走完必勝,兔兔再走...

NOI 兔兔與蛋蛋的遊戲

二維的乙個最大匹配 program game type rec record x,y longint end const numm rec x 0 y 0 dx array 1.4 of integer 0,1,0,1 dy array 1.4 of integer 1,0,1,0 var link...

Noi2011 兔兔與蛋蛋

題目 題解容易想到空格移動的路徑是不會自交的。因為空格移動的路徑是黑白棋相間的 所以對棋盤進行黑白染色,建立二分圖 如果黑白兩格上的棋子不一樣則可以連邊 如果乙個人 a 將空格移入了乙個在最大匹配內的點,那麼它的對手 b 就可以沿著匹配邊前進 否則就相當於找到了一條新的匹配邊 而a只能沿著非匹配邊前...