【LOJ6033】棋盘游戏【二分图博弈】
生活随笔
收集整理的這篇文章主要介紹了
【LOJ6033】棋盘游戏【二分图博弈】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
傳送門
顯然是個二分圖,設開始位置是左邊,另一邊是右邊
那么先手是把左邊挪到右邊,后手是把右邊挪到左邊,不能挪的那方失敗
結論:Alice必勝當且僅當開始位置不一定在最大匹配上
必要性:
如果開始位置不在最大匹配上,那一定有種匹配方案不包含開始位置(廢話)
考慮這種方案,由于左邊已經空出來了,所以右邊和它連通的點都已經有匹配。
這樣Bob移動到哪里,Alice就移到它的匹配點,這樣Alice必勝。
充分性:
考慮逆否命題,如果開始位置一定在最大匹配上,那么Bob必勝。
①如果右邊有和開始位置相鄰的未匹配點
Bob移到這個位置,然后轉換為了上面的情況
②如果沒有
那就移到匹配點
因為開始點一定在最大匹配上,所以移了之后找不到未匹配點
同理后面如果左邊有未匹配點就找到了一條增廣路,矛盾
這樣可以一直走匹配點直到勝利
所以先跑個最大匹配,從未匹配點開始dfs,對所有與之相鄰點給匹配點打上標記
#include <iostream> #include <cstdio> #include <cstring> #include <cctype> #define MAXN 10005 #define MAXM 50005 using namespace std; struct edge{int u,v;}e[MAXM]; int head[MAXN],nxt[MAXM],cnt; void addnode(int u,int v) {e[++cnt]=(edge){u,v};nxt[cnt]=head[u];head[u]=cnt; } int n,m; char s[105][105]; #define id(x,y) (((x)-1)*m+(y)) const int dx[]={-1,1,0,0},dy[]={0,0,-1,1}; int link[MAXN],used[MAXN]; bool find(int u,int mark) {for (int i=head[u];i;i=nxt[i])if (used[e[i].v]!=mark){used[e[i].v]=mark;if (!link[e[i].v]||find(link[e[i].v],mark)) return link[e[i].v]=u,true;}return false; } bool ans[MAXN]; void dfs(int u) {for (int i=head[u];i;i=nxt[i])if (!ans[link[e[i].v]]){ans[link[e[i].v]]=true;dfs(link[e[i].v]);} } int main() {scanf("%d%d",&n,&m);for (int i=1;i<=n;i++) scanf("%s",s[i]+1);for (int x=1;x<=n;x++)for (int y=1;y<=m;y++)if (s[x][y]=='.'&&(x+y)&1)for (int i=0;i<4;i++)if (s[x+dx[i]][y+dy[i]]=='.')addnode(id(x,y),id(x+dx[i],y+dy[i]));int d=0;for (int x=1;x<=n;x++)for (int y=1;y<=m;y++)if (s[x][y]=='.'&&(x+y)&1)d+=find(id(x,y),id(x,y)),ans[id(x,y)]=1;cerr<<d<<endl;for (int x=1;x<=n;x++)for (int y=1;y<=m;y++)if (s[x][y]=='.'&&!((x+y)&1))link[id(x,y)]? ans[link[id(x,y)]]=0,link[link[id(x,y)]]=id(x,y):ans[id(x,y)]=1;int tcnt=cnt;for (int i=1;i<=tcnt;i++) addnode(e[i].v,e[i].u);for (int i=1;i<=n*m;i++) if (ans[i]) dfs(i);int tot=0;for (int x=1;x<=n;x++)for (int y=1;y<=m;y++)tot+=ans[id(x,y)];printf("%d\n",tot);for (int x=1;x<=n;x++)for (int y=1;y<=m;y++)if (ans[id(x,y)])printf("%d %d\n",x,y);return 0; }總結
以上是生活随笔為你收集整理的【LOJ6033】棋盘游戏【二分图博弈】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【NOI2012】迷失游乐园【概率期望】
- 下一篇: 【NOI2011】兔兔与蛋蛋的游戏【二分