BZOJ2437: [Noi2011]兔兔与蛋蛋
2017-09-12 22:18
253 查看
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 long using 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; }
相关文章推荐
- BZOJ2437 [Noi2011]兔兔与蛋蛋 【博弈论 + 二分图匹配】
- BZOJ2437 NOI2011兔兔与蛋蛋(二分图匹配+博弈)
- NOI2011 兔兔与蛋蛋游戏
- bzoj 2437: [Noi2011]兔兔与蛋蛋
- bzoj2437 [Noi2011]兔兔与蛋蛋
- 【BZOJ 2437】 2437: [Noi2011]兔兔与蛋蛋 (博弈+二分图匹配**)
- bzoj 2437: [Noi2011]兔兔与蛋蛋 (二分图博弈+dinic)
- [BZOJ]2437 [NOI2011] 兔兔与蛋蛋 二分图博弈
- bzoj2437 [Noi2011]兔兔与蛋蛋
- [NOI2011]兔兔与蛋蛋游戏
- 【LOJ】#2447. 「NOI2011」兔兔与蛋蛋的游戏
- [BZOJ]2437: [Noi2011]兔兔与蛋蛋 二分图匹配+博弈
- 【bzoj2437】【NOI2011】【兔兔与蛋蛋】【二分图博弈】
- ★【二分图匹配】【博弈论】【NOI2011】兔兔和蛋蛋的游戏
- [BZOJ 2437][NOI 2011]兔兔与蛋蛋(二分图匹配)
- bzoj 2437[Noi2011]兔兔与蛋蛋 黑白染色二分图+博弈+匈牙利新姿势
- bzoj 2437: [Noi2011]兔兔与蛋蛋 博弈论+二分图匹配
- [二分图博弈] BZOJ 1443 [JSOI2009]游戏Game & BZOJ 2437 [Noi2011]兔兔与蛋蛋
- BZOJ 2437: [Noi2011]兔兔与蛋蛋
- 2437: [Noi2011]兔兔与蛋蛋 - BZOJ