题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1281

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)

Problem Description
小希和Gardon在玩一个游戏:对一个N*M的棋盘,在格子里放尽量多的一些国际象棋里面的“车”,并且使得他们不能互相攻击,这当然很简单,但是Gardon限制了只有某些格子才可以放,小希还是很轻松的解决了这个问题(见下图)注意不能放车的地方不影响车的互相攻击。 
所以现在Gardon想让小希来解决一个更难的问题,在保证尽量多的“车”的前提下,棋盘里有些格子是可以避开的,也就是说,不在这些格子上放车,也可以保证尽量多的“车”被放下。但是某些格子若不放子,就无法保证放尽量多的“车”,这样的格子被称做重要点。Gardon想让小希算出有多少个这样的重要点,你能解决这个问题么?
 
Input
输入包含多组数据, 
第一行有三个数N、M、K(1<N,M<=100 1<K<=N*M),表示了棋盘的高、宽,以及可以放“车”的格子数目。接下来的K行描述了所有格子的信息:每行两个数X和Y,表示了这个格子在棋盘中的位置。
 
Output
对输入的每组数据,按照如下格式输出: 
Board T have C important blanks for L chessmen.
 
Sample Input
3 3 4
1 2
1 3
2 1
2 2
3 3 4
1 2
1 3
2 1
3 2
 
Sample Output
Board 1 have 0 important blanks for 2 chessmen.
Board 2 have 3 important blanks for 3 chessmen.
 
题解:
参考http://www.cnblogs.com/dilthey/p/7647870.html博文中的方法②;
因为这次没有墙能隔开车与车之间的攻击,故直接将整行整列缩成点,然后求出max match;
但是如何寻找其中的“必须边”呢?
比较好想的方法就是直接暴力枚举最大匹配中的匹配边,如果把它去掉还能不能得到一样的最大匹配数:
如果不能,就是必须边,cnt+=1;
 
AC代码:
 #include<cstdio>
#include<cstring>
#include<vector>
#define MAX 203
using namespace std;
int n,m,k;
int edge[MAX][MAX];
int matching[MAX];
int vis[MAX];
void init(){memset(edge,,sizeof(edge));}
void add_edge(int u,int v){edge[u][v]=edge[v][u]=;}
bool dfs(int u)
{
for(int v=;v<=n+m;v++)
{
if(!edge[u][v]) continue;
if (!vis[v])
{
vis[v]=;
if(!matching[v] || dfs(matching[v]))
{
matching[v]=u;
matching[u]=v;
return true;
}
}
}
return false;
}
int hungarian()
{
int ret=;
memset(matching,,sizeof(matching));
for(int i=;i<=n;i++)
{
if(!matching[i])
{
memset(vis,,sizeof(vis));
if(dfs(i)) ret++;
}
}
return ret;
}
int mp[][],match[MAX][MAX];
int main()
{
int kase=;
while(scanf("%d%d%d",&n,&m,&k)!=EOF)
{
memset(mp,,sizeof(mp));
for(int i=,r,c;i<=k;i++)
{
scanf("%d%d",&r,&c);
mp[r][c]=;
} init();
for(int i=;i<=n;i++) for(int j=;j<=m;j++) if(mp[i][j]) add_edge(i,j+n);
int max_match=hungarian(); int cnt=;
memset(match,,sizeof(match));
for(int i=;i<=n+m;i++) for(int j=n+;j<=n+m;j++) if(matching[i]==j && matching[j]==i) match[i][j]=;
for(int i=;i<=n+m;i++)
{
for(int j=n+;j<=n+m;j++)
{
if(match[i][j])
{
edge[i][j]=;
if(hungarian()<max_match) cnt++;
edge[i][j]=;
}
}
} printf("Board %d have %d important blanks for %d chessmen.\n",++kase,cnt,max_match);
}
}

HDU 1281 - 棋盘游戏 - [二分图最大匹配]的更多相关文章

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

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

  2. (step6.3.5)hdu 1281(棋盘游戏——二分图的完美匹配)

    题目大意:本体是中文题.读者可以直接在OJ上看 解题思路: 1)完美匹配:所有的端点都是匹配点 2)对于二分图的完美匹配,我们需要用一个数组来存储匹配点.(而二分图的其他问题(我们则可以直接使用变量来 ...

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

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

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

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

  5. hdu 1281 棋盘游戏

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

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

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

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

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

  8. D - 棋盘游戏 - HDU 1281(二分图匹配)

    分析:先求出来最大匹配数,然后用匹配的点一个一个去除看看能否达到最大匹配,能的话就是关键点(很暴力啊),不过竟然才31ms ************************************** ...

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

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

随机推荐

  1. 7 -- Spring的基本用法 -- 11... 基于XML Schema的简化配置方式

    7.11 基于XML Schema的简化配置方式 Spring允许使用基于XML Schema的配置方式来简化Spring配置文件. 7.11.1 使用p:命名空间简化配置 p:命名空间不需要特定的S ...

  2. linux 停止对某个端口的监听

    1.通过"netstat -anp" 来查看哪些端口被打开. 2.关掉对应的应用程序,则端口就自然关闭了,如:"kill -9 PID" (PID:进程号)

  3. Nginx 解析PHP

    配置如下: [root@localhost ~]$ cat /usr/local/nginx/conf/vhost/test.com.conf server { listen 80; server_n ...

  4. DexArchiveBuilderException

    出现这个问题大概是因为版本资源问题 比如把TextView  改为CompatTextView 解决方法一: 在项目的build.gradle文件中查看自己导入的依赖,看看是否有重复的,如果有的话删除 ...

  5. npm yarn

    1.从接触nodejs开始,一直就青睐于npm包管理工具,熟悉的命令以及提供的各种便利,也让自己没有想过更换为其他的:但是,有人也说过“海纳百川,方可走远”.因此还是有必要了解一下其他的包管理工具,比 ...

  6. 执行上下文、this

    1.js中的执行上下文或者执行环境:execution context,简称EC; 2. console.log(a);//undefined var a=200; fn('lili'); funct ...

  7. java web当中表单提交到后台出现乱码的解决方法

    1.如果提交方式为post,想不乱码,只需要在服务器端设置request对象的编码即可,客户端以哪种编码提交的,服务器端的request对象就以对应的编码接收,比如客户端是以UTF-8编码提交的,那么 ...

  8. IOS设计模式第三篇之外观设计模式

    外观设计模式: 这个外观设计模式提供了一个单独的接口给复杂的子系统.而不是暴露用户的一组类和API,你仅仅暴露一个简单的同一的API. 下面的图片解释这个概念: API的用户根本不知道后面系统的复杂性 ...

  9. 【laravel5.6】 Laravel 数据迁移给表和字段添加注释

    1 引用DB use Illuminate\Support\Facades\DB; 2 up方法 public function up() { Schema::create('code_table', ...

  10. 【PHP】常见算法

    1 冒泡排序 思路:在要排序的一组数中,对当前还未排好的序列,从前往后对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒. 即,每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它 ...