1. 程式人生 > >[模板] 二分圖博弈 && BZOJ2463:[中山市選2009]誰能贏呢?

[模板] 二分圖博弈 && BZOJ2463:[中山市選2009]誰能贏呢?

cout 博弈 增廣路 com log bob 博客 圖. zoj

二分圖博弈

BZOJ 1443 遊戲(二分圖博弈) - free-loop - 博客園

定義

1.博弈者人數為兩人,雙方輪流進行決策。
2.博弈狀態(對應點)可分為兩類(狀態空間可分為兩個集合),對應二分圖兩邊(X集和Y集)。任意合法的決策(對應邊)使狀態從一類跳轉到另一類。(正是由於這個性質使得問題可以用二分圖描述)
3.不可以轉移至已訪問的狀態。(不可重復訪問點)
4.無法轉移者判負。

判定

不妨設起點在二分圖的X集中,那麽先手只能從X集移動到Y集,後手只能從Y集移動到X集。一次遊戲過程對應一條路徑 。若最後停留在X集且無法移動則先手負,停留在Y集則後手負。
考慮該二分圖的某個最大匹配。(註意可能存在多個匹配相同的最大匹配)

若起點s∈X不屬於該最大匹配。則先手所轉移到的點y∈Y一定屬於最大匹配(否則s-y是一個匹配,與最大匹配矛盾)。後手沿著最大匹配的邊走即可,終點t(指無法從t再走一步)一定不可能在Y集中(否則,若t在Y集中,s-...-t為一增廣路,與最大匹配矛盾)。因此先手必敗,後手必勝。
若起點s∈X屬於該最大匹配。則將s從圖中刪除,再求圖的最大匹配。若最大匹配數不變,則s還是不屬於某最大匹配,先手必敗。否則該圖的任意最大匹配都包含s,則先手沿著最大匹配的邊走即可,根據上面的分析,先手必勝。

BZOJ2463

顯然就是一個二分圖...
n為偶數時, 先手方沿匹配邊走, 後手方只能走非匹配邊. 最後後手一定無法走;

n奇數時, 考慮除了起點外的所有點構成一個完美匹配. 後手只需沿匹配邊走, 那麽先手一定無法走.

Code

#include<iostream>
using namespace std;

//---------------------------------------
int n;
int main(){
    while(cin>>n,n){
        cout<<((n&1)?"Bob":"Alice")<<'\n';
    }
    return 0;
}

[模板] 二分圖博弈 && BZOJ2463:[中山市選2009]誰能贏呢?