UVA 12549 Sentry Robots 最小点集覆盖
2015-05-29 14:28
363 查看
这题的模型是二分图最小点集覆盖 即选择最少的行或列来覆盖所有的点
二分图最小点集覆盖 = 最大匹配数
本题需要注意的是障碍物会把行和列分隔开来 所以要拆行拆列
二分图最小点集覆盖 = 最大匹配数
本题需要注意的是障碍物会把行和列分隔开来 所以要拆行拆列
#include <cstdio> #include <cstring> #include <algorithm> #include <vector> using namespace std; const int maxn = 2500 + 10; const int N = 100 + 10; int X, Y; int g[maxn][maxn], linker[maxn]; bool vis[maxn]; bool dfs(int u){ for(int v = 0; v < Y; v++)if(g[u][v] && !vis[v]){ vis[v] = true; if(linker[v] == -1 || dfs(linker[v])){ linker[v] = u; return true; } } return false; } int hungary(){ int ans = 0; memset(linker, -1, sizeof(linker)); for(int u = 0; u < X; u++){ memset(vis, false, sizeof(vis)); if(dfs(u)) ans++; } return ans; } int map , n, m; pair<int, int> Map ; void input(){ int N, x, y; memset(map, 0, sizeof(map)); scanf("%d%d%d", &n, &m, &N); while(N--){ scanf("%d%d", &x, &y); map[x][y] = 1; } scanf("%d", &N); while(N--){ scanf("%d%d", &x, &y); map[x][y] = 2; } } void solve(){ int row_num = -1, col_num = -1; for(int i = 1; i <= n; i++){ bool flag = true; for(int j = 1; j <= m; j++){ if(map[i][j] == 1){ if(flag) ++row_num; Map[i][j].first = row_num; flag = false; } if(map[i][j] == 2) flag = true; } } for(int j = 1; j <= m; j++){ bool flag = true; for(int i = 1; i <= n; i++){ if(map[i][j] == 1){ if(flag) ++col_num; Map[i][j].second = col_num; flag = false; } if(map[i][j] == 2) flag = true; } } X = row_num + 1; Y = col_num + 1; memset(g, 0, sizeof(g)); for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++)if(map[i][j] == 1){ g[Map[i][j].first][Map[i][j].second] = 1; } printf("%d\n", hungary()); } int main() { // freopen("in.txt", "r", stdin); int T; scanf("%d", &T); while(T--){ input(); solve(); } return 0; }
相关文章推荐
- 在Android中访问内置SE和基于SE的卡模拟(一)
- SwipeListView 详解 实现微信,QQ等滑动删除效果
- Hibernate中HQL占位符的一点使用技巧
- 第13周项目—阅读1.2
- 公式编辑
- user、function、role
- kafka的消息发送的三种模式
- 自定义Navigation Bar的Appearance的常用方法
- PHP Directory 函数
- 黑马程序员_java基础_集合(泛型、Map)
- 线性表学习归纳总结一
- 设置SVN忽略文件和目录(三)
- 分析IPNC_RDK H264编码器输出原始码流信息
- PHP Date/Time 函数
- windows时间同步命令
- 关于NTLM使用的账号
- 清理linux内存
- Eclipse下使用SVN插件从服务器获取工程(二)
- List::sort排序
- iOS真机UI调试利器——Reveal(在原转载上有所修改)