HDU1507 Uncle Tom's Inherited Land* 二分图匹配 匈牙利算法 黑白染色
原文链接http://www.cnblogs.com/zhouzhendong/p/8254062.html
题目传送门 - HDU1507
题意概括
有一个n*m的棋盘,有些点是废的。
现在让你用1*2的矩形覆盖所有的不废的点,并且不重叠,问最多可以覆盖多少个1*2的矩形,输出方案,有SPJ。
输入描述:
多组数据,每组首先两个数n,m(如果n和m为0,则结束程序)
然后给出k
然后给出k个二元组(x,y)表示废点的坐标。
题解
按照前两片博文的算法已经不行了,因为方案不对了。
所以我们要进行黑白染色。
仅从(x,y)(x+y为奇数)向四连通方向连边,然后二分图匹配即可。
其中match数组的值就是匹配对象。
代码
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <cstdio>
using namespace std;
const int N=105,K=55;
int dx[4]={ 0, 0,-1, 1};
int dy[4]={-1, 1, 0, 0};
int n,m,k,cnt,pl[N][N],tn[N][N],bj[K],x[K],y[K];
int g[K][K],vis[K],match[K];
bool check(int x,int y){
return 1<=x&&x<=n&&1<=y&&y<=m&&tn[x][y];
}
bool Match(int x){
for (int i=1;i<=cnt;i++)
if (!vis[i]&&g[x][i]){
vis[i]=1;
if (!match[i]||Match(match[i])){
match[i]=x;
return 1;
}
}
return 0;
}
int hungary(){
int res=0;
memset(match,0,sizeof match);
for (int i=1;i<=cnt;i++){
if (!bj[i])
continue;
memset(vis,0,sizeof vis);
if (Match(i))
res++;
}
return res;
}
int main(){
while (~scanf("%d%d",&n,&m)&&(n||m)){
scanf("%d",&k);
memset(pl,0,sizeof pl);
for (int i=1,x,y;i<=k;i++)
scanf("%d%d",&x,&y),pl[x][y]=1;
memset(tn,0,sizeof tn);
cnt=0;
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
if (!pl[i][j]){
bj[tn[i][j]=++cnt]=(i+j)&1;
x[cnt]=i,y[cnt]=j;
}
memset(g,0,sizeof g);
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
if ((i+j)&1)
for (int d=0;d<4;d++){
int a=i+dx[d],b=j+dy[d];
if (check(a,b))
g[tn[i][j]][tn[a][b]]=1;
}
int ans=hungary();
printf("%d\n",ans);
for (int i=1;i<=cnt;i++)
if (match[i])
printf("(%d,%d)--(%d,%d)\n",x[i],y[i],x[match[i]],y[match[i]]);
}
return 0;
}
HDU1507 Uncle Tom's Inherited Land* 二分图匹配 匈牙利算法 黑白染色的更多相关文章
- HDU 1507 Uncle Tom's Inherited Land*(二分图匹配)
Uncle Tom's Inherited Land* Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...
- hdu-----(1507)Uncle Tom's Inherited Land*(二分匹配)
Uncle Tom's Inherited Land* Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...
- hdu1507 Uncle Tom's Inherited Land* 二分匹配
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1507 将i+j为奇数的构成x集合中 将i+j为偶数的构成y集合中 然后就是构建二部图 关键就是构图 然 ...
- HDU1507 Uncle Tom's Inherited Land*
题目是跟 zoj1516是一样的,但多了匹配后的输出 详解zoj1516可见http://www.cnblogs.com/CSU3901130321/p/4228057.html #include & ...
- HDU 1507 Uncle Tom's Inherited Land*(二分匹配,输出任意一组解)
Uncle Tom's Inherited Land* Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...
- XTU 二分图和网络流 练习题 B. Uncle Tom's Inherited Land*
B. Uncle Tom's Inherited Land* Time Limit: 1000ms Memory Limit: 32768KB 64-bit integer IO format: %I ...
- Hdu 1507 Uncle Tom's Inherited Land* 分类: Brush Mode 2014-07-30 09:28 112人阅读 评论(0) 收藏
Uncle Tom's Inherited Land* Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...
- Uncle Tom's Inherited Land*
Uncle Tom's Inherited Land* Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- HDU 5943 Kingdom of Obsession 【二分图匹配 匈牙利算法】 (2016年中国大学生程序设计竞赛(杭州))
Kingdom of Obsession Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Oth ...
随机推荐
- 【原创】大叔经验分享(40)hdfs关闭kerberos
hadoop.security.authentication: Kerberos -> Simple hadoop.security.authorization: true -> fals ...
- 随机生成游戏用户昵称(nodejs版本)(含机器人头像,金币等)
1 前言 有时需要生成随机的用户(或机器人)昵称,头像,金币等,但又不想太生硬,可以现在网上爬一些常见昵称到文本中,然后读取出来,随机使用即可. 2 代码 var nickNameArr = []; ...
- select+异步
IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程.IO多路复用适用如下场合: 当客户处理多个描述符时(一般是交互式输入和网络套接口),必须使用I/O复用. 当一个客户 ...
- jqGrid后台交互样例
schoolManageGrid = $("#jqGrid").jqGrid({ url : ctx.path+"/api/school/querySchools&quo ...
- EasyUI 如何结合JS导出Excel文件
出处:http://blog.csdn.net/jumtre/article/details/41119991 EasyUI 如何结合JS导出Excel文件 分类: 技术 Javascript jQu ...
- Confluence 6 外部小工具在其他应用中设置可信关系
为了在你的 Confluence 中与其他应用建立外部小工具,我们建议你在 2 个应用之间设置 OAuth 或者信任的应用连接关系.在这个例子中,外部应用为小工具的服务器(服务器提供者)和 Confl ...
- Spark Streaming通过JDBC操作数据库
本文记录了学习使用Spark Streaming通过JDBC操作数据库的过程,源数据从Kafka中读取. Kafka从0.10版本提供了一种新的消费者API,和0.8不同,因此Spark Stream ...
- 一.定时任务详解https://i.cnblogs.com/EditPosts.aspx
定时任务的详解 h每小时运行 d每天运行 w每周运行 m每个月运行 中毒时查看系统定时任务是否有病毒的脚本. crontab -l 查看用户的定时任务 crontab -e 进入编辑界面增加 ...
- Nginx详解二十三:Nginx深度学习篇之Nginx+Lua开发环境搭建
Nginx+Lua开发环境 1.下载LuaJIT解释器wget http://luajit.org/download/LuaJIT-2.0.2.tar.gztar -zxvf LuaJIT-2.0.2 ...
- PyCharm新建.py文件时自动带出指定内容
如:给Pycharm加上头行 # coding:utf-8File—Setting—Editor--Code Style--File and Code Templates--Python Scrip ...