hdu1507——Uncle Tom's Inherited Land*
Uncle Tom's Inherited Land*
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2114 Accepted Submission(s): 867
Special Judge
squares. He turned some of the squares into ponds, for he loved to hunt ducks and wanted to attract them to his property. (You cannot be sure, for you have not been to the place, but he may have made so many ponds that the land may now consist of several disconnected
islands.)
Your uncle Tom wants to sell the inherited land, but local rules now regulate property sales. Your uncle has been informed that, at his great-great-uncle's request, a law has been passed which establishes that property can only be sold in rectangular lots the
size of two squares of your uncle's property. Furthermore, ponds are not salable property.
Your uncle asked your help to determine the largest number of properties he could sell (the remaining squares will become recreational parks).

K indicating the number of squares that have been turned into ponds ( (N x M) - K <= 50). Each of the next K lines contains two integers X and Y describing the position of a square which was turned into a pond (1 <= X <= N and 1 <= Y <= M). The end of input
is indicated by N = M = 0.
If there are more than one solution, anyone is acceptable. there is a blank line after each test case. See sample below for clarification of the output format.
4 4
6
1 1
1 4
2 2
4 1
4 2
4 4
4 3
4
4 2
3 2
2 2
3 1
0 0
4
(1,2)--(1,3)
(2,1)--(3,1)
(2,3)--(3,3)
(2,4)--(3,4) 3
(1,1)--(2,1)
(1,2)--(1,3)
(2,3)--(3,3)
二分匹配。建边的根据是枚举全部可行的点,然后枚举周围四个方向。输出方案根据mark数组
#include <map>
#include <set>
#include <list>
#include <queue>
#include <stack>
#include <vector>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std;
const int maxn = 10010;
struct node
{
int to;
int next;
}edge[4 * maxn]; int vis[maxn];
int head[maxn];
int mark[maxn];
bool used[maxn];
bool mat[110][110];
int cnt[110][110];
int tot;
int n, m;
int index; void addedge(int from, int to)
{
edge[tot].to = to;
edge[tot].next = head[from];
head[from] = tot++;
} bool dfs(int x)
{
for (int i = head[x]; i != -1; i = edge[i].next)
{
if (!used[edge[i].to])
{
used[edge[i].to] = 1;
if (mark[edge[i].to] == -1 || dfs(mark[edge[i].to]))
{
mark[edge[i].to] = x;
return true;
}
}
}
return false;
} int hungary()
{
memset(mark, -1, sizeof(mark));
int ans = 0;
for (int i = 0; i < index; i++)
{
memset(used, 0, sizeof(used));
if (dfs(i))
ans++;
}
return ans;
} int main()
{
int k;
while (~scanf("%d%d", &n, &m))
{
if (!n && !m)
{
break;
}
scanf("%d", &k);
map<int, int>qu;
qu.clear();
memset(head, -1, sizeof(head));
memset(mat, false, sizeof(mat));
memset(vis, -1, sizeof(vis));
tot=0;
int x, y;
for (int i = 0; i < k; i++)
{
scanf("%d%d", &x, &y);
x--;
y--;
mat[x][y] = true;
}
index = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
if (!mat[i][j])
{
cnt[i][j] = index++;
qu[index - 1] = i * m + j;
} for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
{
if (!mat[i][j])
{
if (i > 0 && !mat[i - 1][j])
addedge(cnt[i][j], cnt[i - 1][j]);
if (i < n-1 && !mat[i + 1][j])
addedge(cnt[i][j], cnt[i + 1][j]);
if (j > 0 && !mat[i][j - 1])
addedge(cnt[i][j], cnt[i][j - 1]);
if (j < m - 1 && !mat[i][j + 1])
addedge(cnt[i][j], cnt[i][j + 1]);
}
}
int res = hungary();
printf("%d\n", res / 2);
for (int i = 0; i < index; ++i)
{
if (mark[i] != -1)
{
int a = qu[i];
int b = qu[mark[i]];
int x1 = a / m + 1;
int y1 = a % m + 1;
int x2 = b / m + 1;
int y2 = b % m + 1;
if (vis[a] == -1 && vis[b] == -1)
{
printf("(%d,%d)--(%d,%d)\n", x1, y1, x2, y2);
vis[a] = b;
vis[b] = a;
}
}
}
printf("\n");
}
return 0;
}
hdu1507——Uncle Tom's Inherited Land*的更多相关文章
- HDOJ 1507 Uncle Tom's Inherited Land*
直接对每一个格子进行dfs结果除以2能够得到答案可是有大量反复的结果,不好输出答案. 能够仅仅对横纵坐标相加是奇数的格子dfs.... Uncle Tom's Inherited Land* Time ...
- ZOJ 1516 Uncle Tom's Inherited Land(二分匹配 最大匹配 匈牙利啊)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=516 Your old uncle Tom inherited a p ...
- 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://www.cnblogs.com/zhouzhendong/p/8254062.html 题目传送门 - HDU1507 题意概括 有一个n*m的棋盘,有些点是废的. 现在让你用1 ...
- 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 ...
- 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 ...
随机推荐
- 解决浏览器自动填充input
浏览器输入框自动填充解决办法 emmmmm:今天处理公司后台系统遇到的:登录页面浏览器保存账号密码后:浏览器会自动在其他页面进行填充:解决如下图: 浏览器会默认填充input type值为passwo ...
- react随笔-1(为什么在react使用jq无法正确渲染组件位置)
今天心血来潮,打开了sublime想玩玩react,然后大家都知道的先引入一大串 就是在百度静态资源库里找到的. 然后贴html代码 对的,没错,就这么一行,毕竟只是测试嘛 然后js代码 大家一定要注 ...
- 「 HDOJ P2227 」 Find the nondecreasing subsequences
# 题目大意 就是找不下降子序列的个数. # 解题思路 一开始想着先离散化,然后再做个 $dp$,发现用 $dp$ 的话时间复杂度是 $\text{O}(n^2)$ 的,稳稳超时. 这里说说 $dp$ ...
- 字典(trie)树--从入门到入土
今天再来认识一个强大的数据结构. 字典树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词 ...
- layui二次封装
最近一直用layui进行页面的重构,这个框架十分适合我们后台人员开发.简单易用,但是layui本身不支持双向绑定,所以很多情况下,我们在支持动态的控件加载时,需要反复刷新.这里我自己封装了一个comm ...
- SONP 是什么
JSONP 是什么 说实话,我学了这么久,其实也没有好好了解这个东西,当然平常自己在前端方面也涉猎较浅. 1) jsonp 是什么 JSONP(JSON with Padding)是JSON的一种&q ...
- c++_凑算式(最新方法)
凑算式 B DEFA + --- + ------- = 10 C GHI (如果显示有问题,可以参见[图1.jpg]) 这个算式中A~I代表1~9的数字,不同的字母代表不同的数字. 比如:6+8/3 ...
- hadoop上传文件报错
19/06/06 16:09:26 INFO hdfs.DFSClient: Exception in createBlockOutputStream java.io.IOException: Bad ...
- 大数据学习——装私服nexus
(一)安装 解压之后 进入bin文件夹下 复制路径 D:\software\nexus-2.12.0-01-bundle\nexus-2.12.0-01\bin 进入命令行窗口输入以下命令,安装成功 ...
- PTA 01-复杂度1 最大子列和问题 (20分)
题目地址 https://pta.patest.cn/pta/test/15/exam/4/question/709 5-1 最大子列和问题 (20分) 给定KK个整数组成的序列{ N_1N1 ...