移動可以理解為空白格的移動,問題等價於雙方在一張無向圖(相鄰不同色點連邊,起點視為黑色)移動,不能經過重複的點,無法移動者為負
由於這張圖是二分圖,因此有結論,先手必勝當且僅當起點一定在任意一組最大匹配中
證明:必要性,即先手必勝=>一定在匹配中,其等價於不在匹配中=>後手必勝,考慮一組最大匹配,容易發現先手所走到的點一定在最大匹配中(否則匹配可以增大),而後手的策略就是一直走到那個點的匹配上,一定必勝
充分性,即一定在匹配中=>先手必勝,那麼當去掉起點後的最大匹配中,一定存在某乙個點使得其可以不在剩下點的最大匹配中,即這個點後手必勝,那麼先手走到這個點即可
具體實現就是說先將其他節點的最大匹配求出,然後再加入這個節點判斷能否增大,每一步都只需要重新判斷新的空格即可
(其實這個東西就是說讓答案+1即存在一條增廣路,而增廣路一定是奇數條邊,所以差不多就是這樣了)
1 #include2view codeusing
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 }
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只能沿著非匹配邊前...