POJ3020-Antenna Placement 无向二分图 匈牙利算法 裸题
来源:互联网 发布:access sql limit 编辑:程序博客网 时间:2024/06/15 05:35
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?
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?
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.
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.
27 9ooo**oooo**oo*ooo*o*oo**o**ooooooooo*******ooo*o*oo*oo*******oo10 1***o******
175
算出最大匹配 ans 那么结果就是 ans+amount-ans*2
#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<vector>#include<map>#include<string>#include<cmath>#define ff(i,x,y) for(int i=x;i<y;i++)#define maxlen 400+7#define maxlen2 40+7using namespace std;int dir[4][2] = {{ -1, 0}, {1, 0}, {0, -1}, {0, 1}};int mp[maxlen2][maxlen2];//原始的map图 0表示openplace 非0表示interesting place 有序号bool mmap[maxlen][maxlen];int n;int m;int key;//保存非0点的数量bool check[maxlen];int matching[maxlen];bool dfs(int u)//无向二分图匈牙利算法 dfs{for(int i = 1; i <= key; i++){if(mmap[u][i]&&check[i] == 0){check[i] = 1;if(matching[i] == -1 || dfs(matching[i]) == 1){matching[i] = u;//两端matchmatching[u] = i;return true;}}}//forreturn false;}int main(){//freopen("test.txt", "r", stdin);int t;scanf("%d", &t);while(t--){memset(mmap,0,sizeof mmap);scanf("%d %d", &n, &m);//inputkey = 0;for(int i = 0; i < n; i++){char x[maxlen];scanf("%s", x);for(int j = 0; j < m; j++){if(x[j] == 'o')mp[i][j] = 0;else{mp[i][j] = ++key;}}}//for//construct graphfor(int i = 0; i < n; i++){for(int j = 0; j < m; j++){if(mp[i][j] == 0)continue;int ordera = mp[i][j];for(int k = 0; k < 4; k++){int newx = i + dir[k][0];int newy = j + dir[k][1];if((0 <= newx && newx < n) && (0 <= newy && newy < m)){if(mp[newx][newy] == 0)continue;int orderb = mp[newx][newy];if(!mmap[ordera][orderb])mmap[ordera][orderb] = mmap[orderb][ordera] = 1;}}}}//do 匈牙利int ans = 0;memset(matching, -1, sizeof matching);for(int i = 1; i <= key; i++){if(matching[i] == -1){memset(check, 0, sizeof check);if(dfs(i) == 1)ans++;}}printf("%d\n", ans+key-ans*2);}return 0;}
阅读全文
0 0
- POJ3020-Antenna Placement 无向二分图 匈牙利算法 裸题
- POJ3020 Antenna Placement(二分图匹配 匈牙利算法)
- POJ3020《Antenna Placement》方法:无向图最小路径覆盖 匈牙利算法
- poj 3020 Antenna Placement(二分无向图 匈牙利)
- poj3020 Antenna Placement(无向图最小边覆盖)
- POJ3020--Antenna Placement--二分图最大匹配
- poj3020 Antenna Placement(二分图)
- POJ3020 Antenna Placement 二分匹配
- poj3020--Antenna Placement(二分匹配)
- POJ3020 Antenna Placement 解题报告--匈牙利
- Antenna Placement--匈牙利算法
- POJ3020——Antenna Placement(二分图最大匹配)
- POJ3020 Antenna Placement【二分图最小边覆盖】
- POJ3020 Antenna Placement 二分匹配 || 一般图匹配
- POJ3020 Antenna Placement(二分图最小路径覆盖)
- poj3020 匈牙利算法+公式:二分无向图的最小路径覆盖 = 顶点数 - 最大二分匹配数 / 2
- poj_3020 Antenna Placement匈牙利算法
- poj 3020 Antenna Placement (最小路径覆盖, 匈牙利算法, 拆点形成二分图)
- 更好的方式运行php-fpm
- 链表的有序集合
- C语言实现斐波那契数列递归和非递归算法
- 卷积层
- 剑指offer面试题[27]-二叉搜索树与双向链表
- POJ3020-Antenna Placement 无向二分图 匈牙利算法 裸题
- 《机器学习实战》学习笔记-[9]-回归-加权最小二乘LWLR
- Servlet常用的六个对象
- 求二叉树结点最大距离
- 常用Socket函数详解
- 高斯相关内容
- 【计算机网络】网络诊断工具ping的模拟实现之具体细节
- (104)反射:获取Class的对象、构造函数、字段、方法。反射实例练习
- asp.net4.0网站开发与项目实战—学习笔记1