POJ-3041-Asteroids 解题报告
来源:互联网 发布:谷歌手机软件 编辑:程序博客网 时间:2024/05/18 01:22
二分图求最小点集覆盖。题意:贝西驾驶她的飞船在一片N*N的网格状小行星地带。这片网格里面有K个小行星,都位于网格的格点。贝西有一个强大的武器,使用一次可以指定网格地带中任意一行或者一列中的小行星消失,但是这种武器非常昂贵,所以她希望使用尽量少的次数使得这片网格状地带里的小行星全部消失。
我的解题思路:求二分图最小点集覆盖的经典模型。以这片网格状地带的行号和列号分别建立成二分图的两个点集,那么每一个小行星的坐标(x,y)就相当于行号点集中的x与列号点集中的y有一条边,然后求选定最少的行点或者列点使得与所有边都有联系即为求这个二分图的最小点集覆盖。由二分图的最小点集覆盖等于二分图的最大匹配可以得到答案。
我的解题代码:
#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>#include <vector>using namespace std;#define N 555vector <int> e[N];int match[N];bool vis[N];int n, k;void InitRead();void DataProcess();bool Dfs(int x);int main(){ while (~scanf("%d %d", &n, &k)) { InitRead(); DataProcess(); } return 0;}void InitRead(){ memset(match, -1, sizeof(match)); for (int i=0; i<=n; ++i) { e[i].clear(); } int a, b; for (int i=0; i<k; ++i) { scanf("%d %d", &a, &b); e[a].push_back(b); } return;}void DataProcess(){ int ans = 0; for (int i=1; i<=n; ++i) { memset(vis, false, sizeof(vis)); if (Dfs(i)) ans++; } printf("%d\n", ans); return;}bool Dfs(int x){ int size = e[x].size(); for (int i=0; i<size; ++i) { if (!vis[e[x][i]]) { vis[e[x][i]] = true; if (match[e[x][i]] == -1 || Dfs(match[e[x][i]])) { match[e[x][i]] = x; return true; } } } return false;}
0 0
- POJ-3041-Asteroids 解题报告
- hdu 1240 poj 2225 Asteroids! 三维bfs 解题报告
- Asteroids之BFS解题报告
- 解题报告 之 POJ3041 Asteroids
- POJ 3041 解题报告
- POJ 3041 Asteroids
- poj 3041 Asteroids
- POJ-3041 Asteroids
- Poj 3041 Asteroids
- poj 3041 Asteroids
- poj 3041 Asteroids
- POJ:3041Asteroids
- poj 3041 Asteroids
- POJ 3041 Asteroids
- POJ 3041 Asteroids
- POJ 3041 Asteroids
- POJ 3041 Asteroids
- POJ 3041 Asteroids
- 初识xcode,
- onsubmit="return check() 给form加onsubmit 验证所有表单后再提交,可以用返回false 来阻止submit提交
- LeetCode Word Break
- Linux系统结构 详解
- DCL-MYSQL
- POJ-3041-Asteroids 解题报告
- Java,JavaSE和JavaEE的区别
- 真是垃圾啊
- imageswitcher进行图片的切换
- Swift教程_swift常见问题(0004)_swift代码不能自动提示和补全
- oralce查找dump文件语句
- 【LeetCode】Maximum Product Subarray
- ffmpeg文档5:同步视频
- 【codeforces】484E. Sign on Fence 可持久化线段树