[2017雅礼集训]day2 T2 二分图关键点&&博弈
2017-04-05 18:45
369 查看
首先看到棋盘就要想到二分图模型。
建出二分图,考虑求出了一个最大匹配,假如Alice把棋放在一个未匹配点上,Bob无论如何都会走到一个匹配点上,然后Alice每次都可以选择走匹配边,直到Bob输。
所以只要求出这个图的所有非关键点(存在一种最大匹配不包含该点),都是Alice的必胜点。
求非关键点的方法:先求出最大匹配,首先对一侧,所有未匹配点能走交错路到的点都是非关键点,在对另一侧做同样的操作。
代码:
建出二分图,考虑求出了一个最大匹配,假如Alice把棋放在一个未匹配点上,Bob无论如何都会走到一个匹配点上,然后Alice每次都可以选择走匹配边,直到Bob输。
所以只要求出这个图的所有非关键点(存在一种最大匹配不包含该点),都是Alice的必胜点。
求非关键点的方法:先求出最大匹配,首先对一侧,所有未匹配点能走交错路到的点都是非关键点,在对另一侧做同样的操作。
代码:
type edge=^edgenode; edgenode=record t:longint; next:edge; end; var n,m,i,j,ans:longint; c:char; b,visit,unkey:array[0..10100]of boolean; link:array[0..10100]of longint; con:array[0..10100]of edge; procedure ins(x,y:longint); var p:edge; begin if b[x] and b[y]=false then exit; new(p); p^.t:=y; p^.next:=con[x]; con[x]:=p; new(p); p^.t:=x; p^.next:=con[y]; con[y]:=p; end; function pipei(x:longint):boolean; var p:edge; begin pipei:=false; p:=con[x]; while p<>nil do begin if visit[p^.t]=false then begin visit[p^.t]:=true; if (link[p^.t]=-1)or(pipei(link[p^.t])=true) then begin link[p^.t]:=x; exit(true); end; end; p:=p^.next; end; end; procedure dfs(v:longint); var p:edge; begin if v=-1 then exit; visit[v]:=true; unkey[v]:=true; inc(ans); p:=con[v]; while p<>nil do begin if (link[v]<>p^.t)and(link[p^.t]<>-1)and(visit[link[p^.t]]=false) then dfs(link[p^.t]); p:=p^.next; end; end; begin readln(n,m); for i:=1 to n*m do begin read(c); if c='#' then b[i]:=false else b[i]:=true; if i mod m=0 then readln; end; for i:=1 to n*m do begin if i mod m<>1 then ins(i,i-1); if i mod m<>0 then ins(i,i+1); if i-m>0 then ins(i,i-m); if i+m<=n*m then ins(i,i+m); end; for i:=1 to n*m do link[i]:=-1; for i:=1 to n*m do if ((i-1) div m+(i-1) mod m)mod 2=0 then begin fillchar(visit,sizeof(visit),false); pipei(i); end; for i:=1 to n*m do if link[i]<>-1 then link[link[i]]:=i; fillchar(unkey,sizeof(unkey),false); fillchar(visit,sizeof(visit),false); ans:=0; for i:=1 to n*m do if (b[i]=true)and(link[i]=-1)and(visit[i]=false) then dfs(i); writeln(ans); for i:=1 to n*m do if (unkey[i]=true)and(b[i]=true) then writeln((i-1) div m+1,' ',(i-1) mod m+1); readln; end.
相关文章推荐
- [线段树][二分图 霍尔定理]LOJ#6062 && 2017 山东一轮集训 Day2. Pair
- [二分图博弈] BZOJ 1443 [JSOI2009]游戏Game & BZOJ 2437 [Noi2011]兔兔与蛋蛋
- [2017雅礼集训6-28]T2 jump
- [2017雅礼集训]day10 T2 数列 最长上升子序列
- [2017雅礼集训]day9 T2 价 最小割/最大权闭合子图
- 集训Day2 T2 新壳栈
- FJ省队集训DAY2 T2
- leetcode day2 -- Sort List && Insertion Sort List
- 10月集训test17&&test18
- NOIP 2014 提高组 Day2 T2 寻找道路
- hdu 棋盘游戏 (求二分图最大匹配的关键点)
- POJ 3480 & HDU 1907 John(尼姆博弈变形)
- NOIP2011 Day2 T2 聪明的质监员
- 洛谷新春OI集训营 - 省选 Day2 T2 序列
- noip2017 Day2 T2 宝藏
- Bzoj - 1443 [JSOI2009]游戏Game [二分图博弈]
- NYOJ 135 & 585 (博弈问题)
- 二分图:最大独立集&最大匹配&最小顶点覆盖
- UVA 12530 Game of Tiles (二分图完备匹配,博弈)
- [简单博弈] hdu 1525 Euclid's Game