zoukankan      html  css  js  c++  java
  • [模板] 二分图博弈 && BZOJ2463:[中山市选2009]谁能赢呢?

    二分图博弈

    from 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-[中山市选2009]谁能赢呢?

    Description

    Problem 2463. -- [中山市选2009]谁能赢呢?

    Solution

    显然就是一个二分图...

    考虑用1*2骨牌覆盖方格, 骨牌相当于一条匹配边.
    n为偶数时, 骨牌恰好覆盖整个棋盘. 整个先手方沿匹配边走, 后手方只能走非匹配边. 最后后手一定无法走;
    n为奇数时, 考虑除了起点外的所有点可以被骨牌覆盖, 也就是构成一个完美匹配. 后手只需沿匹配边走, 那么先手最后一定无法走.

    Code

    #include<iostream>
    using namespace std;
    int n;
    int main(){
    	while(cin>>n,n){
    		cout<<((n&1)?"Bob":"Alice")<<'
    ';
    	}
    	return 0;
    }
    
  • 相关阅读:
    caffe:使用C++来提取任意一张图片的特征(从内存读取数据)
    python:控制鼠标和键盘
    .dll 文件编写和使用
    python:打包成exe程序
    python:小乌龟turtle
    python:input()和raw_input()
    C++:哈希
    C++:线程(std::thread)
    GitHub:Git的使用
    链表
  • 原文地址:https://www.cnblogs.com/ubospica/p/10295217.html
Copyright © 2011-2022 走看看