先对整幅图进行二分图染色,再跑一遍匈牙利算法。如果最大匹配数=点数*2,那么输出WIN。

对于任何一个非必须在最大匹配上的点,即为所求的点。

  1. Program Test375num2;
  2. type arr=record
  3. u,v,next:longint;
  4. end;
  5. const dx:array[..] of longint=(,,-,);
  6. dy:array[..] of longint=(,-,,);
  7. maxn=;
  8. maxm=maxn*;
  9. var map:array[..,..] of longint;
  10. cl:array[..maxn] of longint;
  11. eg:array[..maxm] of arr;
  12. last:array[..maxn] of longint;
  13. l,r,f:array[..maxn] of longint;
  14. pd:array[..maxn] of boolean;
  15. i,j,m,n,num,sum,x:longint;
  16. ch:char;
  17. procedure dfs(i,j,w:longint);
  18. var k,x,y:longint;
  19. begin
  20. cl[map[i,j]]:=w;
  21. for k:= to do
  22. begin
  23. x:=i+dx[k]; y:=j+dy[k];
  24. if (map[x,y]>) and (cl[map[x,y]]=) then
  25. dfs(x,y,-w);
  26. end;
  27. end;
  28. procedure add(u,v:longint);
  29. begin
  30. inc(sum);
  31. eg[sum].u:=u;
  32. eg[sum].v:=v;
  33. eg[sum].next:=last[u];
  34. last[u]:=sum;
  35. end;
  36. procedure put(i,j:longint);
  37. var k,x,y:longint;
  38. begin
  39. for k:= to do
  40. begin
  41. x:=i+dx[k]; y:=j+dy[k];
  42. if (map[x,y]>) then add(map[i,j],map[x,y]);
  43. end;
  44. end;
  45. function Hungarian(u:longint):boolean;
  46. var i,v:longint;
  47. begin
  48. i:=last[u];
  49. while i<> do
  50. begin
  51. v:=eg[i].v;
  52. if not pd[v] then
  53. begin
  54. pd[v]:=true;
  55. if (l[v]=) or Hungarian(l[v]) then
  56. begin
  57. r[u]:=v;
  58. l[v]:=u;
  59. exit(true);
  60. end;
  61. end;
  62. i:=eg[i].next;
  63. end;
  64. exit(false);
  65. end;
  66. procedure dfsl(u:longint);
  67. var i,v:longint;
  68. begin
  69. f[u]:=;
  70. i:=last[u];
  71. while i<> do
  72. begin
  73. v:=eg[i].v;
  74. if f[v]= then
  75. begin
  76. f[v]:=;
  77. if f[l[v]]= then dfsl(l[v]);
  78. end;
  79. i:=eg[i].next;
  80. end;
  81. end;
  82.  
  83. procedure dfsr(u:longint);
  84. var i,v:longint;
  85. begin
  86. f[u]:=;
  87. i:=last[u];
  88. while i<> do
  89. begin
  90. v:=eg[i].v;
  91. if f[v]= then
  92. begin
  93. f[v]:=;
  94. if f[r[v]]= then dfsr(r[v]);
  95. end;
  96. i:=eg[i].next;
  97. end;
  98. end;
  99. begin
  100. readln(m,n);
  101. num:=; sum:=;
  102. for i:= to m do
  103. begin
  104. for j:= to n do
  105. begin
  106. read(ch);
  107. if ch='.' then
  108. begin
  109. map[i,j]:=(i-)*n+j;
  110. inc(num);
  111. end
  112. else map[i,j]:=-;
  113. end;
  114. readln;
  115. end;
  116. for i:= to m do
  117. for j:= to n do
  118. if (map[i,j]>) and (cl[map[i,j]]=) then
  119. dfs(i,j,);
  120. for i:= to m do
  121. for j:= to n do
  122. if map[i,j]> then put(i,j);
  123.  
  124. fillchar(l,sizeof(l),);
  125. fillchar(r,sizeof(r),);
  126. sum:=;
  127. for i:= to m*n do
  128. if cl[i]= then
  129. begin
  130. fillchar(pd,sizeof(pd),false);
  131. if Hungarian(i) then inc(sum);
  132. end;
  133. if sum*=num then
  134. begin
  135. writeln('LOSE');
  136. halt;
  137. end;
  138. writeln('WIN');
  139. fillchar(f,sizeof(f),);
  140. for i:= to m*n do
  141. if (cl[i]>) and (f[i]=) and (l[i]=) and (r[i]=) then
  142. if cl[i]= then dfsl(i) else dfsr(i);
  143. for i:= to m do
  144. for j:= to n do
  145. begin
  146. x:=(i-)*m+j;
  147. if f[x]= then writeln(i,' ',j);
  148. end;
  149. end.

ps:好像没有LOSE的点 ←_ ←

BZOJ1443 游戏game (二分图染色+匈牙利算法)的更多相关文章

  1. CODEVS1022 覆盖 (二分图染色+匈牙利算法)

    先对整幅图进行二分图染色,再跑一遍匈牙利算法. /* CODEVS1022 */ #include <cstdio> #include <cstring> #include & ...

  2. HDU 5943 Kingdom of Obsession 【二分图匹配 匈牙利算法】 (2016年中国大学生程序设计竞赛(杭州))

    Kingdom of Obsession Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Oth ...

  3. USACO 4.2 The Perfect Stall(二分图匹配匈牙利算法)

    The Perfect StallHal Burch Farmer John completed his new barn just last week, complete with all the ...

  4. HDU 2444 - The Accomodation of Students - [二分图判断][匈牙利算法模板]

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2444 Time Limit: 5000/1000 MS (Java/Others) Mem ...

  5. 矩阵游戏|ZJOI2007|BZOJ1059|codevs1433|luoguP1129|二分图匹配|匈牙利算法|Elena

    1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 162 MB Description 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩 ...

  6. BZOJ1059 [ZJOI2007]矩阵游戏 二分图匹配 匈牙利算法

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1059 题意概括 有一个n*n(n<=200)的01矩阵,问你是否可以通过交换整行和整列使得左 ...

  7. [bzoj]1059矩阵游戏<二分图匹配*匈牙利算法>

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1059 初见此题,我觉得这是水题,我认为只要每一行和每一列至少存在一个黑格就可以出现对角线, ...

  8. UESTC 919 SOUND OF DESTINY --二分图最大匹配+匈牙利算法

    二分图最大匹配的匈牙利算法模板题. 由题目易知,需求二分图的最大匹配数,采取匈牙利算法,并采用邻接表来存储边,用邻接矩阵会超时,因为邻接表复杂度O(nm),而邻接矩阵最坏情况下复杂度可达O(n^3). ...

  9. Codevs 1222 信与信封问题 二分图匹配,匈牙利算法

    题目: http://codevs.cn/problem/1222/ 1222 信与信封问题   时间限制: 1 s   空间限制: 128000 KB   题目等级 : 钻石 Diamond 题解 ...

随机推荐

  1. poj3463 Sightseeing——次短路计数

    题目:http://poj.org/problem?id=3463 次短路计数问题,在更新最短路的同时分类成比最短路短.长于最短路而短于次短路.比次短路长三种情况讨论一下,更新次短路: 然而其实不必被 ...

  2. IJ:IJ笔记1

    ylbtech-IJ:IJ笔记1 1. 下拉框返回顶部 1. <form:select id="type" path="baseId" class=&qu ...

  3. 新版chrome调整开发者工具位置方式改变

    转自:https://blog.csdn.net/gsls200808/article/details/70244150 本文所指新版56.0.2924.87 (64-bit) 原来F12可以看到窗口 ...

  4. vue-router路由加载两种模式

    路由安装npm install --save vue-router 安装完成后,打开package.json,如果看到这个"vue-router": 版本号, 就代表安装成功了   ...

  5. linux 防火墙关闭

     systemctl status firewalld.servicesystemctl status iptables.service关闭防火墙,selinux15:54:43运维-李浩 2017/ ...

  6. HTML--使用单选框、复选框,让用户选择

    在使用表单设计调查表时,为了减少用户的操作,使用选择框是一个好主意,html中有两种选择框,即单选框和复选框,两者的区别是单选框中的选项用户只能选择一项,而复选框中用户可以任意选择多项,甚至全选.请看 ...

  7. UNIX环境高级编程--2

    UNIX标准及实现 ISO C: 国际标准化组织(International Organization for standardization , ISO)ISO C标准的意图是提供C程序的可移植性, ...

  8. Web页面使用VLC播放插件

    一.原生态Demo下载 选择原因:我们为什么选择VLC播放插件?原因是它支持IE8浏览器播放视频,如果高版本的浏览器大可不必选择该插件,很多html5插件既好用又简单,但是有些交管或政府 部门还是限制 ...

  9. 【1】Jdk1.8中的HashMap实现原理

    HashMap概述 HashMap是基于哈希表的Map接口的非同步实现.此实现提供所有可选的映射操作,并允许使用null值和null键.此类不保证映射的顺序,特别是它不保证该顺序恒久不变. 内部实现 ...

  10. Android studio USB连接失败

    Android studio USB连接失败,可能是因为adb的端口被占了,此时在其自带的cmd中输入netstat -aon|findstr "5037",并且启动任务管理器关掉 ...