hdu1507--二分图最大匹配
题意:你大爷。哦不!
你大叔继承了一块地什么的都是废话。。
,这里说说题意,和怎么建图。
题意:这里有一块N*M的地,可是有 K 个地方。是池塘,然后输入K行(x,y),OK,如今能够出售的地必须是 1*2 大小的矩形,而且不能是池塘。。。
问。在N*M的这块地上。能有多少块地能够出售,而且。要输出这些能够出售的地的坐标。
建图:那么这里事实上和我之前做过的hdu4185 差点儿相同1A。
。http://blog.csdn.net/zyy173533832/article/details/12654539
那么能够预先处理一下,把N*M的地图中,是土地的按 1,2,3....编号。在这里我们须要对于每一个编号。记录这个编号的土地的坐标。那么这里他说了N*M-K <= 50。那么我们接着对于每一个土地,遍历四个方向,看看有木有能够组在一起变成能卖的地。然后。。。然后图就建好啦。
那么在二分匹配的过程中也要注意的是:匹配好的数量须要÷2,输出的时候也有点须要注意的,直接看代码中的解释:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std; #define MAX 105 int N,M,K;
int map[MAX][MAX];
int loc[MAX/2][2];//这里是依据编号记录坐标 如第2个地的坐标 (loc[2][0] , loc[2][1])
int node_num; //点数,也就是土地的数量。编号的那个 struct Edge{//邻接表
int to,next;
}edge[MAX*4];
int head[MAX/2],edge_num; void add(int u,int v){
edge[edge_num].to = v;
edge[edge_num].next = head[u];
head[u] = edge_num++;
} int vis[4][2]={0,1,0,-1,1,0,-1,0}; void initMap(){
node_num = 1;
memset(map,0,sizeof(map)); int x,y;
while(K --){
cin >> x >> y;
map[x][y] = -1;//表示此地不可用。是池塘
} for(int i = 1; i <= N; i ++){
for(int j = 1; j <= M; j ++){
if(!map[i][j]) {
map[i][j] = node_num++;
loc[node_num-1][0] = i; loc[node_num-1][1] = j;//记录坐标
}
}
} edge_num = 0;
memset(head,-1,sizeof(head));
for(int i = 1; i <= N; i ++){
for(int j = 1; j <= M; j ++){
if(map[i][j] != -1){
for(int k = 0; k < 4; k ++)
{
int x = i+vis[k][0],y = j+vis[k][1];
if(map[x][y] != -1 && x >=1 && y >= 1 && x <= N && y <= M)
{
add(map[i][j],map[x][y]); add(map[x][y],map[i][j]);
}
}
}
}
}
}
//------------------------
bool useif[MAX/2];
int link[MAX/2];
bool dfs(int u){
for(int i = head[u]; i != -1; i = edge[i].next){
int v = edge[i].to;
if(!useif[v]){
useif[v] = true;
if(link[v] == -1 || dfs(link[v]))
{
link[v] = u;
return true;
}
}
}
return false;
}
void match(){
int ans_num = 0;
memset(link,-1,sizeof(link));
for(int i = 1; i <= node_num; i ++){
memset(useif,false,sizeof(useif));
if(dfs(i)) ans_num++;
cout << ans_num/2 <<endl;
bool ifmatch[MAX/2]={false}; //这里是表示这个点是不是被输出过
for(int i = 1; i <= node_num; i ++){
if(!ifmatch[i] && link[i] != -1 && !ifmatch[link[i]]){
ifmatch[i] = true; ifmatch[link[i]] = true;
printf("(%d,%d)--(%d,%d)\n",loc[i][0],loc[i][1],loc[link[i]][0],loc[link[i]][1]);
}
}
} int main()
{
bool first_cas = true;//控制案例间空行
while(cin >> N >> M)
{
if(!N && !M) break;
cin >> K;
initMap();
if(!first_cas) cout << endl;
match();
first_cas = false;
}
return 0;
}
个人愚昧观点,欢迎指正与讨论
hdu1507--二分图最大匹配的更多相关文章
- POJ 2226二分图最大匹配
匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名.匈牙利算法是基于Hall定理中充分性证明的思想,它是二部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图 ...
- POJ2239 Selecting Courses(二分图最大匹配)
题目链接 N节课,每节课在一个星期中的某一节,求最多能选几节课 好吧,想了半天没想出来,最后看了题解是二分图最大匹配,好弱 建图: 每节课 与 时间有一条边 #include <iostream ...
- poj 2239 二分图最大匹配,基础题
1.poj 2239 Selecting Courses 二分图最大匹配问题 2.总结:看到一个题解,直接用三维数组做的,很巧妙,很暴力.. 题意:N种课,给出时间,每种课在星期几的第几节课上 ...
- UESTC 919 SOUND OF DESTINY --二分图最大匹配+匈牙利算法
二分图最大匹配的匈牙利算法模板题. 由题目易知,需求二分图的最大匹配数,采取匈牙利算法,并采用邻接表来存储边,用邻接矩阵会超时,因为邻接表复杂度O(nm),而邻接矩阵最坏情况下复杂度可达O(n^3). ...
- 二分图最大匹配的König定理及其证明
二分图最大匹配的K?nig定理及其证明 本文将是这一系列里最短的一篇,因为我只打算把K?nig定理证了,其它的废话一概没有. 以下五个问题我可能会在以后的文章里说,如果你现在很想知道的话,网上 ...
- POJ3057 Evacuation(二分图最大匹配)
人作X部:把门按时间拆点,作Y部:如果某人能在某个时间到达某门则连边.就是个二分图最大匹配. 时间可以二分枚举,或者直接从1枚举时间然后加新边在原来的基础上进行增广. 谨记:时间是个不可忽视的维度. ...
- ZOJ1654 Place the Robots(二分图最大匹配)
最大匹配也叫最大边独立集,就是无向图中能取出两两不相邻的边的最大集合. 二分图最大匹配可以用最大流来解. 如果题目没有墙,那就是一道经典的二分图最大匹配问题: 把地图上的行和列分别作为点的X部和Y部, ...
- HDU:过山车(二分图最大匹配)
http://acm.hdu.edu.cn/showproblem.php?pid=2063 题意:有m个男,n个女,和 k 条边,求有多少对男女可以搭配. 思路:裸的二分图最大匹配,匈牙利算法. 枚 ...
- UOJ #78 二分图最大匹配
#78. 二分图最大匹配 从前一个和谐的班级,有 nl 个是男生,有 nr 个是女生.编号分别为 1,…,nl 和 1,…,nr. 有若干个这样的条件:第 v 个男生和第 u 个女生愿意结为配偶. 请 ...
- 【网络流#6】POJ 3041 Asteroids 二分图最大匹配 - 《挑战程序设计竞赛》例题
学习网络流中ing...作为初学者练习是不可少的~~~构图方法因为书上很详细了,所以就简单说一说 把光束作为图的顶点,小行星当做连接顶点的边,建图,由于 最小顶点覆盖 等于 二分图最大匹配 ,因此求二 ...
随机推荐
- 基于JVM规范的并发编程解决方案
在并发的世界里,选择合适的状态处理方法将对并发性和正确性起到决定性的影响.这方面可选的方法有:共享可变性.隔离可变性以及完全不可变性. 对于并发问题来说最好的解决方法是从根本上消灭它而不是花很多时间解 ...
- XML wsdl soap xslt xsl ide
XML wsdl soap xslt xsl ide 作者Attilax , EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn. ...
- 让工程师爱上CMMI,实现管理于无形 --- 中标软件CMMI L5之路 (1/2)
操作系统市场被微软等国外的IT厂商垄断的大环境下,中标软件作为市场夹缝中发展起来的民族企业,致力于成为中国操作系统旗舰企业.系列核心产品已经在政府.金融.教育.财税.公安.审计.交通.医疗.制造等行业 ...
- Oracle静态监听与动态监听概念全解析
基于11g,linux5.5做出的测试,单实例数据库做出的测试. 1.注册 Instance到监听器去注册自己的Instance_name与ORACLE_HOME,还可以选择添加global_dbna ...
- Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
原文:Lucene.Net 2.3.1开发介绍 -- 二.分词(五) 2.1.3 二元分词 上一节通过变换查询表达式满足了需求,但是在实际应用中,如果那样查询,会出现另外一个问题,因为,那样搜索,是只 ...
- Mac OS升级到Yosemite后一些问题
苹果"优山美地"採用移动设备平面风格,看起来还是相当清爽. 只是升级完还是有一些程序兼容性问题的. 1. 开发Android的程序猿们,Java se 6 须要升级到2014_00 ...
- Android CTS 结果 testResult.xml 修改 fail 项 为 notExecuted 项 分析
这两天一直在搞 Android 4.1 CTS ,每次完整跑完一遍后总有几百项 failed,用编辑器手动改为 notExecuted 项后重新跑,有很多项第二次都跑过了. 但是发现直接修改也带来很多 ...
- cape town
开普敦_百度百科 开普敦
- sql server 2012 数据库还原方法
USE master RESTORE DATABASE WSS_Content FROM DISK = N'D:\bak\contentbak.bak' WITH REPLACE, NORECOVER ...
- 进一步解 apt-get 的几个命令
用 apt-get 也非常久了,没多想它的实现,近期遇到 gstreamer 装不上的问题.才多看看了它 apt-get 就是从网上下载包,并安装到本地 手工下载 dpkg 包,而后 "dp ...