題目
題解容易想到空格移動的路徑是不會自交的。
因為空格移動的路徑是黑白棋相間的
所以對棋盤進行黑白染色,建立二分圖
如果黑白兩格上的棋子不一樣則可以連邊
如果乙個人(a)將空格移入了乙個在最大匹配內的點,那麼它的對手(b)就可以沿著匹配邊前進(否則就相當於找到了一條新的匹配邊)
而a只能沿著非匹配邊前進,這樣到最後肯定是a無路可走(否則就相當於找到了一條新的匹配邊)
所以如果起始點不在最大匹配中那麼先手只能走非匹配邊,即必敗。
另外有可能起始點在最大匹配中,但後手可以沿著另乙個最大匹配前進。
所以必須保證起始點必須在最大匹配中。
具體的話可以給這個點打個刪除標記,看看它的原匹配點能不能找到另乙個物件。
形成**就是先跑一邊匈牙利
然後對於每個操作(把兔兔與蛋蛋的拆開),把經過的點全部刪除,看看空格是否必須在最大匹配中。
注意每執行完一次操作要清vis
黑白染色時相鄰行要錯開
#include #include #include #include #include using namespace std;#define n 2000
#define pos(i,j) ((i-1)*m+j)
char map[50][50];
vectorvec[n];
int mx[4]=,my[4]=,p[n],vis[n],match[n],win[n],n,m;
bool disable[n];
void build(int i,int j)
}bool dfs(int id)
} for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) build(i,j);//建邊
hungary();
cin>>step;
for(int i=1;i<=step*2;i++)
int cnt=0;
for(int i=1;i
cout<
for(int i=1;i<=cnt;i++) printf("%d\n", ans[i]);
}
NOI2011 兔兔與蛋蛋遊戲
傳送門 直接博弈論dfs可以得到75分 然鵝我博弈論學的很pie include define ll long long define inf 10000 using namespace std intread while s 0 s 9 return x f char s 45 int lr ud...
NOI2011 洛谷 兔兔與蛋蛋遊戲
初見安 這裡是傳送門 洛谷p1971 noi2011 兔兔與蛋蛋遊戲 這種題啊 就只能多悟,才能看到了就知道怎麼做 bushi。看題目的操作 每次交替移動黑白棋子。然後就可以想到二分圖了 什麼鬼。空白格仔從初始到終點走的路徑上的格仔都是與之交換過的,並且黑白相間,該路徑與以前走過的路徑不可能有交點。...
bzoj2437 Noi2011 兔兔與蛋蛋
先把棋盤黑白染色,那麼對於o,當且僅當它所處的格仔顏色和空格不一樣才會移動,x相似,那麼對於這些o x,最多也就是被移動1次而已。同時每次空格每次移動所處顏色都是在改變 那麼就是二分圖博弈啊。而走一步相當於刪除乙個點,然後每次就讓被刪的那個點去找增廣路,找到了就必敗,反之必勝。蛋蛋走完必勝,兔兔再走...