刷题记录:二分图

[JSOI2009]游戏Game 

Description 
这里写图片描述
Input 
输入数据首先输入两个整数N,M,表示了迷宫的边长。 接下来N行,每行M个字符,描述了迷宫。 
Output 
若小AA能够赢得游戏,则输出一行”WIN”,然后输出所有可以赢得游戏的起始位置,按行优先顺序输出 每行一个,否则输出一行”LOSE”(不包含引号)。 
Sample Input 
3 3 
.## 
… 
.#.# 
Sample Output 
WIN 
2 3 
3 2 
HINT 
对于100%的数据,有1≤n,m≤100。 对于30%的数据,有1≤n,m≤5。

 

噫我发现 [从会写模板->真正能把题码出来] 真的差距好大呀完蛋了 

所以我要开放一个叫刷题记录的版块/~*u*~/

solution:

我们可以将整个图进行黑白染色,然后求二分图的最大匹配。
求得以后,从任意一个非匹配点出发,先手就已经算走过一步了,后走非匹配边,先手走匹配边,图中一定不存在增广路(因为是最大匹配),即一定以先手的匹配边作为结束,那么先手一定赢。
因为最大匹配可能有很多个,在交错路上的且与非匹配点属于同一集合的点都是答案,因为你匹配或非匹配的身份是可以互换而不影响匹配的,所以那个点也可以作为最大匹配下的非匹配点。
反过来想一想也是很好理解的,如果从这个点开始,可以走过一对对的匹配点到达一个非匹配点,就是奇偶性的问题啦。

 

 

还有以前的

1.棋盘覆盖:

 

        在n*m的棋盘上覆盖1*2的骨牌,有一些位置不能放置,求最多放得下多少张骨牌?

        分析:妙啊,如果我没学二分图大概只会用状压来做,(话说好像状压好像也应该做一下的是吧)。我们可以先把棋盘染成黑白两色,相邻的棋子染成不同的颜色,然后所有的相邻的格子都有一条连线,表示他们可以成为一张牌,图中的最大匹配即为最多骨牌数。诶打着字发现一个问题:难道不用考虑什么并查集嘛,你怎么确定它是标准的二分图?拍拍脑袋发现自己好蠢,能组成一张牌的只能是一个格子以及它的一圈上,那一圈上的格子又有可能和外围一圈的格子凑成一张牌,它们放在一块有没有关系,只要不连边就好了;一个格子的周围格子一定都与中央格子一侧,即在同一边,在同一边有连线怎么办?其实根本就不用担心,周围格子只包括上下左右四个,他们是一定不能连边的,所以这一题真的非常完美。


2.求一个n*m的棋盘最多能放置多少个车?

分析:其实这道题和之前那道柯南解锁是类似的,把行和列分别连边,表示该行该列都不能再使用,最大匹配数即为最多的车的个数。


3.给定n*m的场地,中间可能设置一些障碍物,当两个卫士共线且没有障碍物阻隔时就会互相攻击,求能最多放下多少个互不攻击的卫士?

分析:如果要判断是否共线,要不要考虑解析式的问题啊??看了一下题解好像是我想多了。。。其实我觉得这一道题还是有一定的难度的,明显是前几题的升级版。本质上来说还是按照行和列来做,只是障碍物把行或列分成若干个联通块,预处理一下给联通块们编个号,行联和列联之间连线表示在该行联该列联的交点处放置一个卫兵,连了线以后那么所占的行的联通块和列的联通块就不能够再选了,最大匹配即为最多放置卫兵数6666好妙啊

 

转载于:https://www.cnblogs.com/OcahIBye/p/6740946.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值