BZOJ 1433 二分图上的博弈
首先对网格染色,发现是而二分图。
那么即在二分图上选一个起点走过的点无法再走,最后无路可走就输了。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int Maxn=;
const int Inf=0x3f3f3f3f;
int n,m,S,T,g[][],Color[Maxn],head[Maxn],Level[Maxn],Q[Maxn],u,v,cnt,cur[Maxn],Ans[Maxn],ans;
bool vis[Maxn];
struct Node{int to,next,w;}edge[];
const int dx[]={,,,-};
const int dy[]={,-,,};
inline int Id(int x,int y) {return (x-)*m+y;}
inline bool Check(int u,int v) {return ((u<=n&&u>=)&&(v<=m&&v>=));}
inline int Min(int x,int y) {return x>y?y:x;}
inline void ADD(int u,int v,int w)
{edge[cnt].to=v;edge[cnt].next=head[u];edge[cnt].w=w;head[u]=cnt++;}
inline void Add(int u,int v,int w) {ADD(u,v,w);ADD(v,u,);}
bool Bfs()
{
memset(Level,-,sizeof(Level));
Level[S]=; Q[]=S; int l=,r=;
while (l<=r)
{
int u=Q[l++];
for (int i=head[u];i!=-;i=edge[i].next)
if (Level[edge[i].to]==- && edge[i].w>)
{
Level[edge[i].to]=Level[u]+;
Q[++r]=edge[i].to;
}
}
if (Level[T]==-) return false;
return true;
}
int Find(int u,int low)
{
if (u==T || low==) return low;
int cap=;
for (int i=cur[u];i!=-;i=edge[i].next)
if (edge[i].w> && Level[edge[i].to]==Level[u]+)
{
int tmp=Find(edge[i].to,Min(low,edge[i].w));
if (tmp==) continue;
low-=tmp,cap+=tmp;
edge[i].w-=tmp,edge[i^].w+=tmp;
if (edge[i].w>) cur[u]=i;
}
if (cap) return cap;
Level[u]=-;
return ;
}
void Dfs(int u,int c)
{
vis[u]=true;
if (Color[u]==c && u!=S && u!=T) Ans[++ans]=u;
for (int i=head[u];i!=-;i=edge[i].next)
if (edge[i].w==c && !vis[edge[i].to]) Dfs(edge[i].to,c);
} void Get_Ans()
{
memset(vis,false,sizeof(vis)),Dfs(S,);
memset(vis,false,sizeof(vis)),Dfs(T,);
}
int main()
{
// freopen("c.in","r",stdin);
// freopen("c.out","w",stdout);
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
{
char ch=getchar();
while (ch!='.' && ch!='#') ch=getchar();
if (ch=='.') g[i][j]=;
if (ch=='#') g[i][j]=;
}
S=,T=Id(n,m)+;
memset(head,-,sizeof(head));
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
if (g[i][j])
{
if (!((i+j)&))
{
Add(S,Id(i,j),);
Color[Id(i,j)]=true;
for (int k=;k<;k++)
{
int u=i+dx[k],v=j+dy[k];
if (!Check(u,v)) continue;
if (g[u][v]) Add(Id(i,j),Id(u,v),);
}
}
else Add(Id(i,j),T,);
}
// for (int i=0;i<cnt;i++) printf("%d ",edge[i].to); puts("");
// for (int i=0;i<cnt;i++) printf("%d ",edge[i].w);puts("");
// for (int i=1;i<cnt;i++) printf("%d ",edge[i].next);puts("");
while (Bfs())
{
for (int i=S;i<=T;i++) cur[i]=head[i];
Find(S,Inf);
}
Get_Ans();
if (!ans) puts("LOSE"); else
{
puts("WIN");
sort(Ans+,Ans+ans+);
for (int i=;i<=ans;i++) printf("%d %d\n",(Ans[i]-)/m+,(Ans[i]-)%m+);
}
// if ()
return ;
}
C++
BZOJ 1433 二分图上的博弈的更多相关文章
- [ZJOI2009]假期的宿舍 BZOJ 1433 二分图匹配
题目描述 学校放假了 · · · · · · 有些同学回家了,而有些同学则有以前的好朋友来探访,那么住宿就是一个问题.比如 A 和 B 都是学校的学生,A 要回家,而 C 来看B,C 与 A 不认识. ...
- bzoj 1433 二分图匹配
裸地匈牙利或者最大流,直接匹配就行了 需要注意的是(我就没注意细节WA了好多次...) 每个人和自己之间的边是0,但是应该是1 不是在校生是没有床的.... /******************** ...
- BZOJ - 2744 朋友圈 (二分图上的最大团)
[题目大意] 在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着.一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他人的尊敬,所以现在就是需要你求朋友圈的最大数目.两 ...
- [BZOJ 4025]二分图(线段树分治+带边权并查集)
[BZOJ 4025]二分图(线段树分治+带边权并查集) 题面 给出一个n个点m条边的图,每条边会在时间s到t出现,问每个时间的图是否为一个二分图 \(n,m,\max(t_i) \leq 10^5\ ...
- bzoj 4025 二分图 分治+并查集/LCT
bzoj 4025 二分图 [题目大意] 有n个点m条边,边会在start时刻出现在end时刻消失,求对于每一段时间,该图是不是一个二分图. 判断二分图的一个简单的方法:是否存在奇环 若存在奇环,就不 ...
- Bzoj 4147: [AMPPZ2014]Euclidean Nim(博弈)
4147: [AMPPZ2014]Euclidean Nim Time Limit: 1 Sec Memory Limit: 256 MB Description Euclid和Pythagoras在 ...
- bzoj 1443 二分图博弈
这种两个人轮流走,不能走 走过的格子的大都是二分图博弈... #include<bits/stdc++.h> #define LL long long #define fi first # ...
- BZOJ 1443 二分图博弈 网络流
思路: 二分图博弈嘛 找到最大匹配的必须点 跑个网络流 前后DFS一遍 //By SiriusRen #include <queue> #include <cstdio> #i ...
- BZOJ 1059 & 二分图匹配
题意: 判断一个黑白染色的棋盘能否通过交换行或列使对角线上都是黑色. SOL: 真是有点醉...这种问题要么很神要么很水...第一眼感觉很水但就是不造怎么做...想了10分钟怎么感觉就是判断个数够不够 ...
随机推荐
- php入门
最近公司招了几个应届毕业生,他们对前端的了解还挺多,但是对后端的技术一无所知,我觉得,作为一个前端攻城狮,如果你有远大的抱负,就应该雨露均沾... 今天我就跟大家讲一讲PHP最基本的入门,至少别人问起 ...
- web前段 弹出小例子
<html> <head> <meta charset="utf-8"> <meta name="viewport" ...
- 模拟jquery
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- IE7下总提示" 缺少标识符、字符串或数字"
用Jquery easyUI ,IE7下列表显示不了,总提示缺少标识符.字符串或数字.而google,maxthon,firefox,IE10等却没有问题. 原因是Json末尾多了个逗号.IE7下js ...
- SQL LOADER 的用法 TXT文件导入非常之快
前提,需要本地安装ORACLE 客户端 控制文件 cms.ctl load dataCHARACTERSET UTF8infile 'oracle.txt'APPEND INTO TABLE JR f ...
- GridFS图片
-----------2016-5-9 18:58:56-- source:GridFS实现图片的存取
- Android技能树
第一部分:Android(安卓)Android基础知识Android内存泄漏总结Handler内存泄漏分析及解决Android性能优化ListView详解RecyclerView和ListView的异 ...
- 与SQL注入第一次相遇
sql注入的含义sql注入是将代码插入(拼接)到应用(用户)的输入参数中, 之后再将这些参数传递给后台的SQL服务器加以解析并执行的攻击, 总结起来就是攻击者将恶意代码拼接到sql语句并加以执行从而得 ...
- vs---错误收集并自己解决后归纳
1.C++编译时,出现这样的错误 d:\program files\microsoft visual studio\vc98\include\stdio.h(36) : error C2143: sy ...
- 读javascript高级程序设计12-HTML5脚本编程
一.跨文档消息传递(XDM) 1.发送消息 postMessage(msg,domain)用于发送跨文档消息.第一个参数是要传递的消息内容,第二个参数表示接收方来自哪个域.第二个参数有助于提高安全性, ...