链接:https://vjudge.net/problem/HDU-1281

题目:

小希和Gardon在玩一个游戏:对一个N*M的棋盘,在格子里放尽量多的一些国际象棋里面的“车”,并且使得他们不能互相攻击,这当然很简单,但是Gardon限制了只有某些格子才可以放,小希还是很轻松的解决了这个问题(见下图)注意不能放车的地方不影响车的互相攻击。 
所以现在Gardon想让小希来解决一个更难的问题,在保证尽量多的“车”的前提下,棋盘里有些格子是可以避开的,也就是说,不在这些格子上放车,也可以保证尽量多的“车”被放下。但是某些格子若不放子,就无法保证放尽量多的“车”,这样的格子被称做重要点。Gardon想让小希算出有多少个这样的重要点,你能解决这个问题么?

思路:

根据x和y建立二分图,求最大匹配,再通过枚举x,y点,挨个消除点进行最大匹配,当某个点被消除以后,最大匹配减小,则这个点为关键点。

代码:

  1. #include <iostream>
  2. #include <memory.h>
  3. #include <string>
  4. #include <istream>
  5. #include <sstream>
  6. #include <vector>
  7. #include <stack>
  8. #include <algorithm>
  9. #include <map>
  10. #include <queue>
  11. #include <math.h>
  12. #include <cstdio>
  13. #include <set>
  14. #include <iterator>
  15. #include <cstring>
  16. using namespace std;
  17.  
  18. typedef long long LL;
  19. const int MAXN = 2000+10;
  20. vector<int> G[MAXN];
  21. int Map[200][200];
  22. int Link[MAXN], Vis[MAXN];
  23. int n, m, k;
  24.  
  25. void Init()
  26. {
  27. for (int i = 1;i <= n;i++)
  28. G[i].clear();
  29. }
  30.  
  31. bool Dfs(int x)
  32. {
  33. for (int i = 1;i <= m;i++)
  34. {
  35. if (Map[x][i] && Vis[i] == 0)
  36. {
  37. Vis[i] = 1;
  38. if (Link[i] == -1 || Dfs(Link[i]))
  39. {
  40. Link[i] = x;
  41. return true;
  42. }
  43. }
  44. }
  45. return false;
  46. }
  47.  
  48. int Solve()
  49. {
  50. memset(Link, -1, sizeof(Link));
  51. int cnt = 0;
  52. for (int i = 1;i <= n;i++)
  53. {
  54. memset(Vis, 0, sizeof(Vis));
  55. if (Dfs(i))
  56. cnt++;
  57. }
  58. return cnt;
  59. }
  60.  
  61. int main()
  62. {
  63. int pos = 0;
  64. while (~scanf("%d%d%d", &n, &m, &k))
  65. {
  66. memset(Map, 0, sizeof(Map));
  67. int x, y;
  68. for (int i = 1;i <= k;i++)
  69. {
  70. scanf("%d%d", &x, &y);
  71. Map[x][y] = 1;
  72. }
  73. int cnt = Solve(), res = 0;
  74. for (int i = 1;i <= n;i++)
  75. {
  76. for (int j = 1;j <= m;j++)
  77. if (Map[i][j])
  78. {
  79. Map[i][j] = 0;
  80. int tmp = Solve();
  81. Map[i][j] = 1;
  82. if (tmp < cnt)
  83. res++;
  84. }
  85. }
  86. printf("Board %d have %d important blanks for %d chessmen.\n", ++pos, res, cnt);
  87. }
  88.  
  89. return 0;
  90. }

  

HDU-1281-棋盘游戏(最大匹配,枚举)的更多相关文章

  1. HDU 1281——棋盘游戏——————【最大匹配、枚举删点、邻接表方式】

     棋盘游戏 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status ...

  2. hdu 1281 棋盘游戏

    http://acm.hdu.edu.cn/showproblem.php?pid=1281 棋盘游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  3. hdu 1281 棋盘游戏(二分匹配)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1281 棋盘游戏 Time Limit: 2000/1000 MS (Java/Others)    M ...

  4. HDU 1281 棋盘游戏 (枚举+最大匹配)

    <题目链接> Problem Description 小希和Gardon在玩一个游戏:对一个N*M的棋盘,在格子里放尽量多的一些国际象棋里面的“车”,并且使得他们不能互相攻击,这当然很简单 ...

  5. HDU 1281 - 棋盘游戏 - [二分图最大匹配]

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

  6. HDU 1281 棋盘游戏 【二分图最大匹配】

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1281 题意概括: 有N*M大的棋盘,要在里面放尽量多的“车”,求最多能放的车的个数,和为了放最多的车有多 ...

  7. hdu 1281 棋盘游戏(二分图)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1281 每行每列作为节点,给可以放车的点将对应的行列连边,最多可放置的车即为建二分图后的最大匹配,跑一边 ...

  8. hdu 1281 棋盘游戏 (二分匹配)

    棋盘游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  9. HDU——1281 棋盘游戏

    棋盘游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  10. hdu 1281 二分图最大匹配

    对N个可以放棋子的点(X1,Y1),(x2,Y2)......(Xn,Yn);我们把它竖着排看看~(当然X1可以对多个点~) X1   Y1 X2   Y2 X3   Y3 ..... Xn   Yn ...

随机推荐

  1. tensorflow 线性回归 iris

    线性拟合

  2. Oracle学习笔记_05_ 一个创建表空间、创建用户、授权的完整过程

    一.完整命令 su - oracle sqlplus /nolog conn /as sysdba create tablespace scaninvoice logging datafile '/u ...

  3. C++常见错误总结

    1.  error C2871: 'std' : does not exist or is not a namespace 原来 C++有两个不同版本的头文件.引入名字空间这个概念以前编译器用的是#i ...

  4. Adobe Flash Player 27 on Fedora 27/26, CentOS/RHEL 7.4/6.9

    This is guide, howto install Adobe Flash Player Plugin version 27 (32-bit and 64-bit) with YUM/DNF o ...

  5. JAVA 编程思想二

    1: java  单根继承的优点? 方便垃圾回收: 垃圾回收的设计会方便实现.   多重继承的函数重名的问题. 2: 向下转型和向上转型?    向下转型不安全,向上转型安全. 3: system.g ...

  6. webSocket 简单介绍

    WebSocket :WebSocket协议支持(在受控环境中运行不受信任的代码的)客户端与(选择加入该代码的通信的)远程主机之间进行全双工通信.                       简单的说 ...

  7. [poj1830]开关问题(高斯消元)

    题意:求高斯消元中自由元的个数,输出1<<ans; #include<cstdio> #include<cstdlib> #include<cstring&g ...

  8. linux中syslog自定义存储路径的方法

    方法一: 1. su  //切换到root用户下2. cp /etc/sysconfig/rsyslog /etc/sysconfig/rsyslogbak //备份vim /etc/sysconfi ...

  9. hostent结构体和wsadata结构体

    一.hostent结构体 使用这个东西,首先要包含2个头文件:#include <netdb.h>#include <sys/socket.h> struct hostent ...

  10. js选中select

    function selected(id, val) { $('#' + id + ' option[value="' + val + '"]').attr('selected', ...