/* THE PROGRAM IS MADE BY PYY */
/*----------------------------------------------------------------------------//
Copyright (c) 2011 panyanyany All rights reserved.
URL : http://poj.org/problem?id=2226
Name : 2226 Muddy Fields
Date : Sunday, December 04, 2011
Time Stage : two hours
Result:
9625653 panyanyany
2226
Accepted 9168K 125MS C++
Test Data :
Review :
先附上大牛的解题报告,以示尊敬和感谢:
http://blog.csdn.net/weiguang_123/article/details/6923711
http://blog.csdn.net/acmj1991/article/details/6825090
这题比较纠结,虽然跟 poj 3041 Asteroids 有点像,但毕竟还是很不相同的。
起码一开始没有思路,看了人家的解题报告,也是琢磨了好久的。
具体思路:
因为这是一个矩阵,那么就有两种方法可以适用于任何情况。第一种是把矩阵划分为
r 行,然后按行来铺木板,这样不论有多少人泥地,怎么分布,都可以铺上去。第二种是把
矩阵划分为 c 列,然后按列来铺木板。
这两种方法的特点是不考虑最优化。
如果要考虑最优化呢?可以把按行划分的所有木板编号,为 Y 点集,把按列划分的
所有木板编号,为 X 点集。
那么,怎么样使 x 和 y 点集连线呢?可以先对被同一块木板覆盖的方格都统一编号
为木板的编号。不过,同一个方格必然会被两个不同的木板覆盖,所以就要有两套图,
第一套只记录以行划分的编号,第二套只记录以列划分的编号。如此一来,同一点的两个
不同编号(比如x1, y1),就代表 X 点集中 点x1 与 Y 点集中 点y1 有一条公共边。
然后再二分匹配求最大匹配即可。
最后,要注意数组,不能开太大,否则MLE,太小了则WA
//----------------------------------------------------------------------------*/
#include <stdio.h>
#include <string.h>
#define MAXSIZE 55*55
int r, c, xCnt, yCnt ;
int link[MAXSIZE] ;
bool cover[MAXSIZE] ;
char map[55][55] ;
bool graph[MAXSIZE][MAXSIZE] ;
int mapx[55][55], mapy[55][55] ;
bool find (int cur)
{
int i ;
for (i = 1 ; i <= xCnt ; ++i)
{
if (cover[i] == false && graph[cur][i] == true)
{
cover[i] = true ;
if (link[i] == 0 || find (link[i]))
{
link[i] = cur ;
return true ;
}
}
}
return false ;
}
int getSum ()
{
int i ;
int sum ;
sum = 0 ;
memset (link, 0, sizeof (link)) ;
for (i = 1 ; i <= yCnt ; ++i)
{
memset (cover, 0, sizeof (cover)) ;
sum += find (i) ;
}
return sum ;
}
int main ()
{
int i, j ;
while (~scanf ("%d%d", &r, &c))
{
for (i = 0 ; i < r ; ++i)
scanf ("%s", map[i]) ;
memset (mapx, 0, sizeof (mapx)) ;
memset (mapy, 0, sizeof (mapy)) ;
yCnt = 0 ;
for (i = 0 ; i < r ; ++i)
for (j = 0 ; j < c ; ++j)
if (map[i][j] == '*')
{
++yCnt ;
while (j < c && map[i][j] == '*')
{
mapy[i][j] = yCnt ;
++j ;
}
}
xCnt = 0 ;
for (j = 0 ; j < c ; ++j)
for (i = 0 ; i < r ; ++i)
if (map[i][j] == '*')
{
++xCnt ;
while (i < r && map[i][j] == '*')
{
mapx[i][j] = xCnt ;
++i ;
}
}
memset (graph, 0, sizeof (graph)) ;
for (i = 0 ; i < r ; ++i)
for (j = 0 ; j < c ; ++j)
graph[mapy[i][j]][mapx[i][j]] = 1 ;
printf ("%d\n", getSum ()) ;
}
return 0 ;
}
分享到:
相关推荐
3. POJ2239: Li Ming的选课问题仍然是二分图最大匹配的应用。课程和时间点构成二分图的两部分,如果一门课程在某个时间点上课,就连接这两个节点。目的是计算每周Li Ming最多能上多少门不同的课程。 4. POJ2536: 地...
匈牙利算法是解决无权二分图最大匹配问题的经典算法之一。该算法的核心思想是通过不断寻找所谓的“增广路径”来逐步扩大匹配集M的大小,直到无法再找到增广路径为止。 **关键概念:** - **盖点**:指那些被当前匹配...
* 二分图的最大匹配:匈牙利算法 + poj3041, poj3020 * 最大流的增广路算法:KM算法 + poj1459, poj3436 三、数据结构 * 串:poj1035, poj3080, poj1936 * 排序:快排、归并排、堆排 + poj2388, poj2299 * 简单...
* 二分图的最大匹配:二分图的最大匹配是指计算二分图的最大匹配的算法,如 poj3041、poj3020。 * 最大流的增广路算法:最大流的增广路算法是指计算图的最大流的算法,如 poj1459、poj3436。 三、数据结构 数据...
* 二分图的最大匹配:例如 poj3041、poj3020。 * 最大流的增广路算法:例如 poj1459、poj3436。 3. 数据结构: * 串:例如 poj1035、poj3080、poj1936。 * 排序:例如 poj2388、poj2299。 * 简单并查集的应用...
- 二分图的最大匹配:如匈牙利算法,用于解决二分图的匹配问题,如`poj3041, poj3020`。 - **数据结构** - 字符串处理:如KMP算法和后缀数组,用于字符串搜索和模式匹配,如`poj1035, poj3080`。 - 排序算法:如...
#### 2226 Muddy Fields - 二分匹配 - **知识点**:二分匹配算法。 #### 2230 Watch cow - 欧拉回路 - **知识点**:欧拉回路算法。 #### 2239 Selecting Courses - 二分匹配 - **知识点**:二分匹配算法。 ###...
5. **二分图匹配**:匈牙利算法或Kuhn-Munkres算法用于求解二分图的最大匹配问题,广泛应用于配对问题。 6. **网络流**:包括Ford-Fulkerson算法和Edmonds-Karp算法,它们用于寻找网络中最大流量,可以解决很多实际...
### poj openjudge 1111 最大正向匹配题目解析与解答 #### 题目背景 在算法竞赛和编程挑战中,字符串处理是非常常见的一类问题。本题(poj openjudge 1111)即为一个典型的字符串处理题目,要求找到一系列输入字符...
包括二分图的最大匹配和KM算法,用于解决资源分配类问题,如poj3041和poj3020。 ### 三、数据结构 #### 字符串处理 如Trie树(前缀树)、KMP算法,用于字符串匹配和索引构建,见poj2513和poj1961。 #### 排序 ...
2. **图算法**:包括图的深度优先遍历、广度优先遍历、最短路径算法、最小生成树算法、拓扑排序、二分图的最大匹配以及最大流的增广路算法。如poj3278、poj2049、poj3083是图遍历的例子,poj1860、poj3259等则是最短...
- **解释**:Kuhn-Munkres算法是一种用于求解赋权二分图最大匹配问题的有效方法。 ### 二、数据结构 #### 1. 树 - **例题**:poj1035, poj3080, poj1936 - **解释**:树形数据结构的题目通常涉及树的遍历、查找等...
- **二分图最大匹配**:匈牙利算法,如poj3041和poj3020,解决分配问题。 - **最大流的增广路算法**:KM算法,如poj1459和poj3436,用于寻找网络中能传输的最大流量。 3. **数据结构**: - **字符串处理**:如...
- (poj1459, poj3436):例如匈牙利算法(KM算法),用于解决二分图的最大匹配问题。 ### 三、数据结构 1. **链表、栈、队列**: - (poj1035, poj3080, poj1936):基本的数据结构及其应用场景。 2. **树**: - ...
各种搜索算法,配合POJ上的题目,含标程,及各题解题思路。
标题中的“图的深搜+树状数组练习 POJ 3321(JAVA)”指的是一个编程题目,其中涉及到图的深度优先搜索(DFS, Depth First Search)算法和树状数组(也称为线段树,Segment Tree)的数据结构。这个题目来源于POJ...
用递推方法+高精度算法,解决了poj1832 的连环锁问题,时间32ms。。。。。。
1. **二分图匹配**:如果棋盘上的每个位置可以看作图的一个节点,而不同位置之间的关系(如攻击、防守等)构成边,那么问题可能转化为寻找最大匹配,以确定最多可以放置多少棋子而不相互冲突。 2. **深度优先搜索...
5. **匹配算法**:如KM算法,用于解决二分图的最大匹配问题(poj1459, poj3436)。 ### 三、数据结构 1. **树和二叉树**:树和二叉树的基本操作和应用(poj1035, poj3080, poj1936)。 2. **堆**:堆排序及其在...
本部分涵盖了图算法,包括图的深度优先遍历和广度优先遍历、最短路径算法、最小生成树算法、拓扑排序、二分图的最大匹配和最大流的增广路算法。 (1) 图的深度优先遍历和广度优先遍历: (2) 最短路径算法:dijkstra,...