m×n 棋盤,部分格子有障礙。先手放棋子,雙手輪流移動到相鄰無障礙未訪問格子,無法移動者負。判斷先手必勝策略及所有必勝起始位置。
棋盤黑白染色(鄰接異色)構成二分圖。遊戲等價於:先手選起點,後手沿匹配邊走,先手再沿匹配邊走... 關鍵定理:
// 匈牙利求最大匹配
bool hungary(int u) {
for(int e=head[u]; e; e=E[e].next) {
int v=E[e].to;
if(vis[v]) continue;
vis[v]=1;
if(!match[v] || hungary(match[v])) {
match[v]=u; return true;
}
}
return false;
}
// 交替路 DFS 標記必勝點
void dfs_win(int u, bool win[]) {
win[u]=true;
for(int e=head[u]; e; e=E[e].next) {
int v=E[e].to, w=match[v];
if(w && !win[w]) dfs_win(w, win);
}
}