POJ - 3020 Antenna Placement 二分图 最小路径覆盖
来源:互联网 发布:美工平面设计培训 编辑:程序博客网 时间:2024/05/22 12:07
题目大意:有n个城市,要在这n个城市上建立无线电站,每个无线电站只能覆盖2个相邻的城市,问至少需要建多少个无线电站
解题思路:英语题目好坑,看了半天。。
这题和POJ - 2446 Chessboard类似
可以将所有城市分成两个点集,那么之间的连线就代表无线电站的覆盖关系了。
因为所有城市都要覆盖到,所以根据关系,求出最小路径覆盖就能覆盖所有城市了
#include<cstdio>#include<algorithm>#include<cstring>#include<vector>using namespace std;const int N = 1500;const int M = 50;int vis[N], link[N],g[M][M], h, w, cnt;vector<int> city[N];char str[M];void init() { scanf("%d%d", &h, &w); cnt = 0; memset(g, 0, sizeof(g)); for(int i = 1; i <= h; i++) { scanf("%s", str); for(int j = 0; j < w; j++) if(str[j] == '*') g[i][j+1] = ++cnt; } for(int i = 1; i <= cnt; i++) city[i].clear(); for(int i = 1; i <= h; i++) for(int j = 1; j <= w; j++) if(g[i][j]){ if(i - 1 > 0 && g[i-1][j]) city[g[i][j]].push_back(g[i-1][j]); if(i + 1 <= h && g[i+1][j]) city[g[i][j]].push_back(g[i+1][j]); if(j - 1 > 0 && g[i][j-1]) city[g[i][j]].push_back(g[i][j-1]); if(j + 1 <= w && g[i][j+1]) city[g[i][j]].push_back(g[i][j+1]); } memset(link, 0, sizeof(link));}bool dfs(int u) { for(int i = 0; i < city[u].size(); i++) { int v = city[u][i]; if(vis[v]) continue; vis[v] = 1; if(!link[v] || dfs(link[v])) { link[v] = u; return true; } } return false;}void hungary() { int ans = 0; for(int i = 1; i <= cnt; i++) { memset(vis, 0, sizeof(vis)); if(dfs(i)) ans++; } printf("%d\n", cnt - ans / 2);}int main() { int test; scanf("%d", &test); while(test--) { init(); hungary(); } return 0;}
0 0
- 【二分图+最小路径覆盖】北大 poj 3020 Antenna Placement
- poj 3020 Antenna Placement 二分图最小路径覆盖
- POJ 3020 Antenna Placement ,二分图的最小路径覆盖
- POJ - 3020 Antenna Placement 二分图 最小路径覆盖
- Poj 3020 Antenna Placement (二分图最小路径覆盖)
- POJ 3020 Antenna Placement(二分图最小路径覆盖)
- [POJ 3020]Antenna Placement[二分图最小路径覆盖]
- POJ 3020 Antenna Placement(二分图建图训练 + 最小路径覆盖)
- POJ-3020-Antenna Placement [二分匹配][最小路径覆盖]
- poj 3020 Antenna Placement (最小路径覆盖)
- POJ 3020 Antenna Placement (最小路径覆盖)
- POJ 3020:Antenna Placement(最小路径覆盖)
- POJ 3020Antenna Placement(二分图最小顶点覆盖)
- POJ 3020:Antenna Placement(无向二分图的最小路径覆盖)
- POJ 3020-Antenna Placement(二分图匹配_最小路径覆盖+前向星构图)
- poj 3020 Antenna Placement (最小路径覆盖, 匈牙利算法, 拆点形成二分图)
- POJ:3020-Antenna Placement(二分图的最小路径覆盖)
- [最小路径覆盖、二分图最大匹配]Pku3020--Antenna Placement
- 自定义类写入文件
- tomcat启动停止在Initializing Spring root WebApplicationContext
- C语言入门教程20-预处理指令2-条件编译
- refresh的停车场
- java - calculator
- POJ - 3020 Antenna Placement 二分图 最小路径覆盖
- 仿百度搜索框支持拼音 输入联想
- 使用Java语言实现,自动生成10个整数(1~100,求出生成数列中的最大值和最小值,不允许使用Arrays类的sort方法
- [HTML5]简单网页本地音乐播放器
- poj Multiplication Puzzle(DP)
- Clippper模拟量输出设置
- C语言入门教程21-预处理指令3-文件包含
- 离散事件模拟-银行管理
- 图论的一些总结