poj3020

Antenna Placement
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 4127 Accepted: 2032

Description

The Global Aerial Research Centre has been allotted the task of building the fifth generation of mobile phone nets in Sweden. The most striking reason why they got the job, is their discovery of a new, highly noise resistant, antenna. It is called 4DAir, and comes in four types. Each type can only transmit and receive signals in a direction aligned with a (slightly skewed) latitudinal and longitudinal grid, because of the interacting electromagnetic field of the earth. The four types correspond to antennas operating in the directions north, west, south, and east, respectively. Below is an example picture of places of interest, depicted by twelve small rings, and nine 4DAir antennas depicted by ellipses covering them.

Obviously, it is desirable to use as few antennas as possible, but still provide coverage for each place of interest. We model the problem as follows: Let A be a rectangular matrix describing the surface of Sweden, where an entry of A either is a point of interest, which must be covered by at least one antenna, or empty space. Antennas can only be positioned at an entry in A. When an antenna is placed at row r and column c, this entry is considered covered, but also one of the neighbouring entries (c+1,r),(c,r+1),(c-1,r), or (c,r-1), is covered depending on the type chosen for this particular antenna. What is the least number of antennas for which there exists a placement in A such that all points of interest are covered?

Input

On the first row of input is a single positive integer n, specifying the number of scenarios that follow. Each scenario begins with a row containing two positive integers h and w, with 1 <= h <= 40 and 0 < w <= 10. Thereafter is a matrix presented, describing the points of interest in Sweden in the form of h lines, each containing w characters from the set ['*','o']. A '*'-character symbolises a point of interest, whereas a 'o'-character represents open space.

Output

For each scenario, output the minimum number of antennas necessary to cover all '*'-entries in the scenario's matrix, on a row of its own.

Sample Input

2
7 9
ooo**oooo
**oo*ooo*
o*oo**o**
ooooooooo
*******oo
o*o*oo*oo
*******oo
10 1
*
*
*
o
*
*
*
*
*
*

Sample Output

17
5
 
思路:二分图匹配,最小路径覆盖,建图是按自己的感觉建的相邻的两个连边,(v,u),(u,v)都加到图里面,然后最大匹配就是原先的两倍(不明白)
再然后答案是总点数n-匹配数x
若最大匹配为X,已盖点(指的是两个一组被一个基站覆盖)个数=2*x,未盖点=sum(总点数)-已盖点=sum-2*x应为未盖点肯定是单的,
所以覆盖未盖点的基站个数肯定与未盖点个数一样=sum-s*x所以总的基站数为  x+sum-2*x=sum-x
代码
 1#include<stdio.h>
 2#include<string.h>
 3#include<math.h>
 4#define MAXSIZE 405
 5int dd[4][2]= {{-1,0},{1,0},{0,1},{0,-1}};
 6int result[MAXSIZE+1];
 7short data[MAXSIZE+1][MAXSIZE+1],state[MAXSIZE+1];
 8int h[45][20];
 9int n,m,sum,ans;
10char map[45][20];
11void init()
12{
13    int i,j,k;
14    int xx,yy;
15    sum=0;
16    memset(result,0,sizeof(result));
17    memset(data,0,sizeof(data));
18    scanf("%d%d",&n,&m);
19    for (i=0; i<n ; i++ )
20    {
21        scanf("%s",&map[i]);
22        for (j=0; j<m ; j++ )
23            if (map[i][j]=='*')
24            {
25                sum++;
26                h[i][j]=sum;
27            }

28    }

29    for (i=0; i<n ; i++)
30        for (j=0; j<m; j++)
31            if (map[i][j]=='*')
32            {
33                for (k=0; k<=3; k++)
34                {
35                    xx=i+dd[k][0];
36                    yy=j+dd[k][1];
37                    if (xx>=0&&yy>=0&&xx<n&&yy<m&&map[xx][yy]=='*')
38                        data[h[i][j]][h[xx][yy]]=1;
39                }

40            }

41}

42int find(int a)
43{
44    int i;
45    for (i=1; i<=sum ; i++ )
46    {
47        if (data[a][i]==1&&!state[i])
48        {
49            state[i]=1;
50            if (result[i]==0||find(result[i]))
51            {
52                result[i]=a;
53                return 1;
54            }

55        }

56    }

57    return 0;
58}

59int main()
60{
61    int t,i,j;
62    scanf("%d",&t);
63    for (i=1; i<=t ; i++ )
64    {
65        ans=0;
66        init();
67        for (j=1; j<=sum ; j++ )
68        {
69            memset(state,0,sizeof(state));
70            if (find(j)) ans++;
71        }

72        printf("%d\n",sum-ans/2);
73    }

74    return 0;
75}

76

 

posted on 2012-02-02 12:56 jh818012 阅读(161) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2024年7月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

导航

统计

常用链接

留言簿

文章档案(85)

搜索

最新评论