`

【二分图+最大匹配+有难度】poj 2226 Muddy Fields

阅读更多

 

/* 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 ;
}
 
0
1
分享到:
评论

相关推荐

    二分图匹配题解1

    3. POJ2239: Li Ming的选课问题仍然是二分图最大匹配的应用。课程和时间点构成二分图的两部分,如果一门课程在某个时间点上课,就连接这两个节点。目的是计算每周Li Ming最多能上多少门不同的课程。 4. POJ2536: 地...

    ACM讲课之二分图匹配匈牙利算法学习教案.pptx

    匈牙利算法是解决无权二分图最大匹配问题的经典算法之一。该算法的核心思想是通过不断寻找所谓的“增广路径”来逐步扩大匹配集M的大小,直到无法再找到增广路径为止。 **关键概念:** - **盖点**:指那些被当前匹配...

    ACM常用算法及其相应的练习题.docx

    * 二分图的最大匹配:匈牙利算法 + poj3041, poj3020 * 最大流的增广路算法:KM算法 + poj1459, poj3436 三、数据结构 * 串:poj1035, poj3080, poj1936 * 排序:快排、归并排、堆排 + poj2388, poj2299 * 简单...

    POJ算法题目分类

    * 二分图的最大匹配:二分图的最大匹配是指计算二分图的最大匹配的算法,如 poj3041、poj3020。 * 最大流的增广路算法:最大流的增广路算法是指计算图的最大流的算法,如 poj1459、poj3436。 三、数据结构 数据...

    poj题目分类

    * 二分图的最大匹配:例如 poj3041、poj3020。 * 最大流的增广路算法:例如 poj1459、poj3436。 3. 数据结构: * 串:例如 poj1035、poj3080、poj1936。 * 排序:例如 poj2388、poj2299。 * 简单并查集的应用...

    poj训练计划.doc

    - 二分图的最大匹配:如匈牙利算法,用于解决二分图的匹配问题,如`poj3041, poj3020`。 - **数据结构** - 字符串处理:如KMP算法和后缀数组,用于字符串搜索和模式匹配,如`poj1035, poj3080`。 - 排序算法:如...

    poj图论题目汇总

    #### 2226 Muddy Fields - 二分匹配 - **知识点**:二分匹配算法。 #### 2230 Watch cow - 欧拉回路 - **知识点**:欧拉回路算法。 #### 2239 Selecting Courses - 二分匹配 - **知识点**:二分匹配算法。 ###...

    POJ中级图算法所有题目【解题报告+AC代码】

    5. **二分图匹配**:匈牙利算法或Kuhn-Munkres算法用于求解二分图的最大匹配问题,广泛应用于配对问题。 6. **网络流**:包括Ford-Fulkerson算法和Edmonds-Karp算法,它们用于寻找网络中最大流量,可以解决很多实际...

    ACM-POJ 算法训练指南

    5. **匹配算法**:如KM算法,用于解决二分图的最大匹配问题(poj1459, poj3436)。 ### 三、数据结构 1. **树和二叉树**:树和二叉树的基本操作和应用(poj1035, poj3080, poj1936)。 2. **堆**:堆排序及其在...

    poj openjudge 1111最大正向匹配

    ### poj openjudge 1111 最大正向匹配题目解析与解答 #### 题目背景 在算法竞赛和编程挑战中,字符串处理是非常常见的一类问题。本题(poj openjudge 1111)即为一个典型的字符串处理题目,要求找到一系列输入字符...

    poj各种分类

    包括二分图的最大匹配和KM算法,用于解决资源分配类问题,如poj3041和poj3020。 ### 三、数据结构 #### 字符串处理 如Trie树(前缀树)、KMP算法,用于字符串匹配和索引构建,见poj2513和poj1961。 #### 排序 ...

    acm poj300题分层训练

    2. **图算法**:包括图的深度优先遍历、广度优先遍历、最短路径算法、最小生成树算法、拓扑排序、二分图的最大匹配以及最大流的增广路算法。如poj3278、poj2049、poj3083是图遍历的例子,poj1860、poj3259等则是最短...

    POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类

    - **解释**:Kuhn-Munkres算法是一种用于求解赋权二分图最大匹配问题的有效方法。 ### 二、数据结构 #### 1. 树 - **例题**:poj1035, poj3080, poj1936 - **解释**:树形数据结构的题目通常涉及树的遍历、查找等...

    POJ题目简单分类(ACM)

    - **二分图最大匹配**:匈牙利算法,如poj3041和poj3020,解决分配问题。 - **最大流的增广路算法**:KM算法,如poj1459和poj3436,用于寻找网络中能传输的最大流量。 3. **数据结构**: - **字符串处理**:如...

    acm训练计划(poj的题)

    - (poj1459, poj3436):例如匈牙利算法(KM算法),用于解决二分图的最大匹配问题。 ### 三、数据结构 1. **链表、栈、队列**: - (poj1035, poj3080, poj1936):基本的数据结构及其应用场景。 2. **树**: - ...

    深搜+宽搜+剪枝 配合POJ题目

    各种搜索算法,配合POJ上的题目,含标程,及各题解题思路。

    图的深搜+树状数组练习 POJ 3321(JAVA)

    标题中的“图的深搜+树状数组练习 POJ 3321(JAVA)”指的是一个编程题目,其中涉及到图的深度优先搜索(DFS, Depth First Search)算法和树状数组(也称为线段树,Segment Tree)的数据结构。这个题目来源于POJ...

    poj 1832 代码

    用递推方法+高精度算法,解决了poj1832 的连环锁问题,时间32ms。。。。。。

    POJ1321-Chess Problem

    1. **二分图匹配**:如果棋盘上的每个位置可以看作图的一个节点,而不同位置之间的关系(如攻击、防守等)构成边,那么问题可能转化为寻找最大匹配,以确定最多可以放置多少棋子而不相互冲突。 2. **深度优先搜索...

    ACM常用算法及其相应的练习题 (2).docx

    本部分涵盖了图算法,包括图的深度优先遍历和广度优先遍历、最短路径算法、最小生成树算法、拓扑排序、二分图的最大匹配和最大流的增广路算法。 (1) 图的深度优先遍历和广度优先遍历: (2) 最短路径算法:dijkstra,...

Global site tag (gtag.js) - Google Analytics