BZOJ1443 游戏game (二分图染色+匈牙利算法)
先对整幅图进行二分图染色,再跑一遍匈牙利算法。如果最大匹配数=点数*2,那么输出WIN。
对于任何一个非必须在最大匹配上的点,即为所求的点。
Program Test375num2;
type arr=record
u,v,next:longint;
end;
const dx:array[..] of longint=(,,-,);
dy:array[..] of longint=(,-,,);
maxn=;
maxm=maxn*;
var map:array[..,..] of longint;
cl:array[..maxn] of longint;
eg:array[..maxm] of arr;
last:array[..maxn] of longint;
l,r,f:array[..maxn] of longint;
pd:array[..maxn] of boolean;
i,j,m,n,num,sum,x:longint;
ch:char;
procedure dfs(i,j,w:longint);
var k,x,y:longint;
begin
cl[map[i,j]]:=w;
for k:= to do
begin
x:=i+dx[k]; y:=j+dy[k];
if (map[x,y]>) and (cl[map[x,y]]=) then
dfs(x,y,-w);
end;
end;
procedure add(u,v:longint);
begin
inc(sum);
eg[sum].u:=u;
eg[sum].v:=v;
eg[sum].next:=last[u];
last[u]:=sum;
end;
procedure put(i,j:longint);
var k,x,y:longint;
begin
for k:= to do
begin
x:=i+dx[k]; y:=j+dy[k];
if (map[x,y]>) then add(map[i,j],map[x,y]);
end;
end;
function Hungarian(u:longint):boolean;
var i,v:longint;
begin
i:=last[u];
while i<> do
begin
v:=eg[i].v;
if not pd[v] then
begin
pd[v]:=true;
if (l[v]=) or Hungarian(l[v]) then
begin
r[u]:=v;
l[v]:=u;
exit(true);
end;
end;
i:=eg[i].next;
end;
exit(false);
end;
procedure dfsl(u:longint);
var i,v:longint;
begin
f[u]:=;
i:=last[u];
while i<> do
begin
v:=eg[i].v;
if f[v]= then
begin
f[v]:=;
if f[l[v]]= then dfsl(l[v]);
end;
i:=eg[i].next;
end;
end; procedure dfsr(u:longint);
var i,v:longint;
begin
f[u]:=;
i:=last[u];
while i<> do
begin
v:=eg[i].v;
if f[v]= then
begin
f[v]:=;
if f[r[v]]= then dfsr(r[v]);
end;
i:=eg[i].next;
end;
end;
begin
readln(m,n);
num:=; sum:=;
for i:= to m do
begin
for j:= to n do
begin
read(ch);
if ch='.' then
begin
map[i,j]:=(i-)*n+j;
inc(num);
end
else map[i,j]:=-;
end;
readln;
end;
for i:= to m do
for j:= to n do
if (map[i,j]>) and (cl[map[i,j]]=) then
dfs(i,j,);
for i:= to m do
for j:= to n do
if map[i,j]> then put(i,j); fillchar(l,sizeof(l),);
fillchar(r,sizeof(r),);
sum:=;
for i:= to m*n do
if cl[i]= then
begin
fillchar(pd,sizeof(pd),false);
if Hungarian(i) then inc(sum);
end;
if sum*=num then
begin
writeln('LOSE');
halt;
end;
writeln('WIN');
fillchar(f,sizeof(f),);
for i:= to m*n do
if (cl[i]>) and (f[i]=) and (l[i]=) and (r[i]=) then
if cl[i]= then dfsl(i) else dfsr(i);
for i:= to m do
for j:= to n do
begin
x:=(i-)*m+j;
if f[x]= then writeln(i,' ',j);
end;
end.
ps:好像没有LOSE的点 ←_ ←
BZOJ1443 游戏game (二分图染色+匈牙利算法)的更多相关文章
- CODEVS1022 覆盖 (二分图染色+匈牙利算法)
先对整幅图进行二分图染色,再跑一遍匈牙利算法. /* CODEVS1022 */ #include <cstdio> #include <cstring> #include & ...
- HDU 5943 Kingdom of Obsession 【二分图匹配 匈牙利算法】 (2016年中国大学生程序设计竞赛(杭州))
Kingdom of Obsession Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Oth ...
- USACO 4.2 The Perfect Stall(二分图匹配匈牙利算法)
The Perfect StallHal Burch Farmer John completed his new barn just last week, complete with all the ...
- HDU 2444 - The Accomodation of Students - [二分图判断][匈牙利算法模板]
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2444 Time Limit: 5000/1000 MS (Java/Others) Mem ...
- 矩阵游戏|ZJOI2007|BZOJ1059|codevs1433|luoguP1129|二分图匹配|匈牙利算法|Elena
1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec Memory Limit: 162 MB Description 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩 ...
- BZOJ1059 [ZJOI2007]矩阵游戏 二分图匹配 匈牙利算法
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1059 题意概括 有一个n*n(n<=200)的01矩阵,问你是否可以通过交换整行和整列使得左 ...
- [bzoj]1059矩阵游戏<二分图匹配*匈牙利算法>
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1059 初见此题,我觉得这是水题,我认为只要每一行和每一列至少存在一个黑格就可以出现对角线, ...
- UESTC 919 SOUND OF DESTINY --二分图最大匹配+匈牙利算法
二分图最大匹配的匈牙利算法模板题. 由题目易知,需求二分图的最大匹配数,采取匈牙利算法,并采用邻接表来存储边,用邻接矩阵会超时,因为邻接表复杂度O(nm),而邻接矩阵最坏情况下复杂度可达O(n^3). ...
- Codevs 1222 信与信封问题 二分图匹配,匈牙利算法
题目: http://codevs.cn/problem/1222/ 1222 信与信封问题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 ...
随机推荐
- [App Store Connect帮助]二、 添加、编辑和删除用户(5)创建一个沙盒测试员帐户
如果您的 App 使用了 App 内购买项目或 Apple Pay,您可以在 App Store Connect 中创建沙盒测试员帐户,以便您向用户提供该 App 前,可以使用该帐户在测试环境中运行您 ...
- JavaScript--编程题
某班的成绩出来了,现在老师要把班级的成绩打印出来. 效果图: XXXX年XX月X日 星期X--班级总分为:81 格式要求: 1.显示打印的日期. 格式为类似“XXXX年XX月XX日 星期X” 的当前的 ...
- 【Codeforces827D/CF827D】Best Edge Weight(最小生成树性质+倍增/树链剖分+线段树)
题目 Codeforces827D 分析 倍增神题--(感谢T*C神犇给我讲qwq) 这道题需要考虑最小生成树的性质.首先随便求出一棵最小生成树,把树边和非树边分开处理. 首先,对于非树边\((u,v ...
- UNIX环境高级编程--3
文件IO 函数lseek: 每个打开文件都有一个与其相关联的“当前文件偏移量”,用来度量从文件开始处计算的字节数.除非指定O_APPEND选项,否则该偏移量被置为0.如果文件描述符指向的是一个管道.F ...
- Canvas清空
当canvs与bitmap绑定时,canvas上绘制会导致bitmap改变内容,而且内容时叠加的.这时候需要清空bitmap上的内容,可以用以下做法. Paint paint = new Paint( ...
- 以简单的例子谈一下C#中的COPY
周五晚上加班的时候做一堆ComboBox直接的联动,然后呢,这些cbo的DataSource都是同一个DataTable,当时写代码的时候求快也就没有太注意DataTable的绑定,然后就出了一些小问 ...
- 类QQ账号生成阐述
具体需求如下: 数字账号从60000到9999999999(类似qq号一样的东东) 用户获取数字账号为随机分配,也可递加分配,需要符合如下规则 特殊账号需要保留,不能分配给用户,比如:112233(连 ...
- 回顾Google IO 2016 -Keynote【图解】
Google IO大会倒计时进行中~~ 两名演奏者在使用高空“古筝”. 最后5秒倒计时~~~~全场轰动~ 倒计时结束,IO大会正式开始.屏幕中,一个人把纯白的唱片放入唱片机中. 然后欢快的音乐响起,台 ...
- 为什么有些异常throw出去需要在函数头用throws声明,一些就不用
throw new IllegalStateException(".");不用在函数头声明throws IllegalStateExceptionthrow new IOExcep ...
- GatewayWorker + LayIM实现即时聊天
一.程序目录结构 二.代码展示 附LayIM开发文档:https://www.layui.com/doc/modules/layim.html 1.前端代码 <!DOCTYPE html> ...