zoj1654

maksyuki 发表于 oj 分类,标签:
0

Place the Robots

Robert is a famous engineer. One day he was given a task by his boss. The background of the task was the following: Given a map consisting of square blocks. There were three kinds of blocks: Wall, Grass, and Empty. His boss wanted to place as many robots as possible in the map. Each robot held a laser weapon which could shoot to four directions (north, east, south, west) simultaneously. A robot had to stay at the block where it was initially placed all the time and to keep firing all the time. The laser beams certainly could pass the grid of Grass, but could not pass the grid of Wall. A robot could only be placed in an Empty block. Surely the boss would not want to see one robot hurting another. In other words, two robots must not be placed in one line (horizontally or vertically) unless there is a Wall between them.

Now that you are such a smart programmer and one of Robert's best friends, He is asking you to help him solving this problem. That is, given the description of a map, compute the maximum number of robots that can be placed in the map.

Input

The first line contains an integer T (<= 11) which is the number of test cases.

For each test case, the first line contains two integers m and n (1<= m, n <=50) which are the row and column sizes of the map. Then m lines follow, each contains n characters of '#', '*', or 'o' which represent Wall, Grass, and Empty, respectively.

Output

For each test case, first output the case number in one line, in the format: "Case :id" where id is the test case number, counting from 1. In the second line just output the maximum number of robots that can be placed in that map.

Sample Input

2
4 4
o***
*###
oo#o
***o
4 4
#ooo
o#oo
oo#o
***#

Sample Output

Case :1
3
Case :2
5

Author: XU, Luchuan

Source: ZOJ Monthly, October 2003

 

题目类型:二分图最大匹配

算法分析:由于点的数量比较多,直接建图会TLE,所以需要进行一定的转化。这里先将原来的图进行一个等效:分别将水平方向上冲突的点看做是在一个块中,竖直方向上冲突的的点看做是在一个块中,易知每个块中最多只能选择一个点。然后将水平方向和竖直方向重合的点之间连一条边,这样就将原来的图转化成一个等效的二分图。之后就是在其上跑一个最大匹配