BZOJ2437: [Noi2011]兔兔与蛋蛋
来源:互联网 发布:上海楼盘成交数据 网易 编辑:程序博客网 时间:2024/04/27 21:24
1443的强化版,黑白染色后,节点颜色若和染色不同,因为永远不会到达,可以视为障碍,每次移动空格到一个位置,那个位置的颜色交换到空格处,也变成障碍,所以可视为不能重复经过一点,判断每次操作前是不是必胜态只需判所处的点是否是必经点
#include<set>#include<map>#include<deque>#include<queue>#include<stack>#include<cmath>#include<ctime>#include<bitset>#include<string>#include<vector>#include<cstdio>#include<cstdlib>#include<cstring>#include<climits>#include<complex>#include<iostream>#include<algorithm>#define ll long longusing namespace std;const int maxn = 11000;const int maxm = 110000;const int maxr = 50;const int maxc = 50;const int dx[] = {-1,0,1,0};const int dy[] = {0,1,0,-1};int n,m,sx,sy;int col[maxr][maxc];int num,id[maxr][maxc];int pn[2],pi[2][maxn];struct edge{ int y,nex; edge(){} edge(const int _y,const int _nex){y=_y;nex=_nex;}}a[maxm<<1]; int len,fir[maxn];void ins(const int x,const int y){a[++len]=edge(y,fir[x]); fir[x]=len;}bool v[maxn],flag[maxn];int t[maxn],tp;int match[2][maxn],ki;bool find_(const int x){ if(v[x]) return false; v[t[++tp]=x]=true; for(int k=fir[x];k;k=a[k].nex) { const int y=a[k].y; if(flag[y]) continue; if(!match[!ki][y]||find_(match[!ki][y])) { match[ki][x]=y,match[!ki][y]=x; return true; } } return false;}int sc[maxr][maxc];bool win[maxn];int ansn,ans[maxn];int main(){ len=0; // scanf("%d%d",&n,&m); char str[maxc]; for(int i=1;i<=n;i++) { scanf("%s",str+1); for(int j=1;j<=m;j++) { if(str[j]=='.') sx=i,sy=j,sc[i][j]=0; else if(str[j]=='X') sc[i][j]=0; else sc[i][j]=1; } } memset(col,-1,sizeof col); int scx=(sx+sy)&1,st; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) if(sc[i][j]==(((i+j)&1)^scx)) { col[i][j]=sc[i][j]; id[i][j]=++num; pi[sc[i][j]][++pn[sc[i][j]]]=num; if(i==sx&&j==sy) st=num; } } for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) if(col[i][j]!=-1) { for(int k=0;k<4;k++) { const int x=i+dx[k],y=j+dy[k]; if(col[x][y]!=-1) ins(id[i][j],id[x][y]),ins(id[x][y],id[i][j]); } } } ki=0; for(int i=1;i<=pn[ki];i++) { find_(pi[ki][i]); while(tp) v[t[tp--]]=false; } int q; scanf("%d",&q); q<<=1; for(int i=1;i<=q;i++) { int x,y; scanf("%d%d",&x,&y); x=id[x][y]; win[i]=true; flag[st]=true; if(!match[ki][st]) win[i]=false,ki=!ki; else { y=match[ki][st]; match[ki][st]=0; ki=!ki; match[ki][y]=0; if(find_(y)) win[i]=false; while(tp) v[t[tp--]]=false; } st=x; } for(int i=2;i<=q;i+=2) if(win[i-1]&&win[i]) ans[++ansn]=i>>1; printf("%d\n",ansn); for(int i=1;i<=ansn;i++) printf("%d\n",ans[i]); return 0;}
阅读全文
0 0
- bzoj2437 [Noi2011]兔兔与蛋蛋
- BZOJ2437: [Noi2011]兔兔与蛋蛋
- 【bzoj2437】【NOI2011】【兔兔与蛋蛋】【二分图博弈】
- bzoj2437: [Noi2011]兔兔与蛋蛋 二分图博弈
- bzoj 2437 [Noi2011]兔兔与蛋蛋 [二分图匹配]
- 【博弈+二分图匹配】[NOI2011]兔兔与蛋蛋游戏
- [BZOJ]2437 [NOI2011] 兔兔与蛋蛋 二分图博弈
- 【BZOJ2437】【codevs1949】兔兔与蛋蛋游戏,博弈+二分图匹配
- [二分图博弈] BZOJ 1443 [JSOI2009]游戏Game & BZOJ 2437 [Noi2011]兔兔与蛋蛋
- bzoj 2437: [Noi2011]兔兔与蛋蛋 (二分图博弈+dinic)
- [BZOJ]2437: [Noi2011]兔兔与蛋蛋 二分图匹配+博弈
- ★【二分图匹配】【博弈论】【NOI2011】兔兔和蛋蛋的游戏
- NOI 兔兔与蛋蛋的游戏
- [JZOJ]兔兔和蛋蛋
- [BZOJ 2437][NOI 2011]兔兔与蛋蛋(二分图匹配)
- 【NOI2011T6】兔兔与蛋蛋的游戏-二分图最大匹配+博弈
- BZOJ 2437 兔兔与蛋蛋 (博弈论 二分图匹配)
- [51nos1971]驴蛋蛋与老孙与微分式
- 后缀数组题目小结。
- 欢迎使用CSDN-markdown编辑器
- SpringMVC——使用JSR-303进行校验
- 常见的查找算法
- ORACLE 正负数分开排序 SQL
- BZOJ2437: [Noi2011]兔兔与蛋蛋
- 编译系统组成及程序执行过程
- mapreduce topN算法实现 获取前10个音乐数据
- 穿插纸条 (第37-54关)解的不唯一性
- k计划开奖号
- 利用onNewIntent避免Activity之间的跳转传值多次实体化
- hdu2087 剪花布条 kmp STL暴力
- 分组统计查询
- JSP_request的基本方法