UVa 11419 我是SAM(最小点覆盖+路径输出)
2024-09-21 07:31:27
https://vjudge.net/problem/UVA-11419
题意:一个网格里面有一些目标,可以从某一行,某一列发射一发子弹,可以打掉它;求最少的子弹,和在哪里打?
思路:
每个点的x坐标与y坐标相连,现在就是要找一个最小点覆盖,同时还要输出哪些点被覆盖了。
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std; const int maxn = + ; // 单侧顶点的最大数目 // 二分图最大基数匹配
struct BPM {
int n, m; // 左右顶点个数
vector<int> G[maxn]; // 邻接表
int left[maxn]; // left[i]为右边第i个点的匹配点编号,-1表示不存在
bool T[maxn]; // T[i]为右边第i个点是否已标记 int right[maxn]; // 求最小覆盖用
bool S[maxn]; // 求最小覆盖用 void init(int n, int m) {
this->n = n;
this->m = m;
for(int i = ; i < n; i++) G[i].clear();
} void AddEdge(int u, int v) {
G[u].push_back(v);
} bool match(int u){
S[u] = true;
for(int i = ; i < G[u].size(); i++) {
int v = G[u][i];
if (!T[v]){
T[v] = true;
if (left[v] == - || match(left[v])){
left[v] = u;
right[u] = v;
return true;
}
}
}
return false;
} // 求最大匹配
int solve() {
memset(left, -, sizeof(left));
memset(right, -, sizeof(right));
int ans = ;
for(int u = ; u < n; u++) { // 从左边结点u开始增广
memset(S, , sizeof(S));
memset(T, , sizeof(T));
if(match(u)) ans++;
}
return ans;
} // 求最小覆盖。X和Y为最小覆盖中的点集
int mincover(vector<int>& X, vector<int>& Y) {
int ans = solve();
memset(S, , sizeof(S));
memset(T, , sizeof(T));
for(int u = ; u < n; u++)
if(right[u] == -) match(u); // 从所有X未盖点出发增广
for(int u = ; u < n; u++)
if(!S[u]) X.push_back(u); // X中的未标记点
for(int v = ; v < m; v++)
if(T[v]) Y.push_back(v); // Y中的已标记点
return ans;
}
}; BPM solver; int R, C, N; int main(){
int kase = ;
while(scanf("%d%d%d", &R, &C, &N) == && R && C && N) {
solver.init(R, C);
for(int i = ; i < N; i++) {
int r, c;
scanf("%d%d", &r, &c); r--; c--;
solver.AddEdge(r, c);
}
vector<int> X, Y;
int ans = solver.mincover(X, Y);//把结果放在X,Y里面
printf("%d", ans);
for(int i = ; i < X.size(); i++) printf(" r%d", X[i]+);
for(int i = ; i < Y.size(); i++) printf(" c%d", Y[i]+);
printf("\n");
}
return ;
}
最新文章
- SpringBoot配置属性之DataSource
- [IPA]IOS In App Purchase(内购)验证
- BZOJ 4423: [AMPPZ2013]Bytehattan
- 优秀Python学习资源收集汇总(强烈推荐)
- JQ例子:旋转木马
- Chrome模拟手机浏览网页
- PHYLIP linux安装
- Spark.ML之PipeLine学习笔记
- 【转载】CentOS日志系统组成详解
- 祖国版SoloWheel:Airwheel爱尔威火星车 拆箱&;上手经验_运动户外_晒物广场_什么值得买
- Google Dataflow
- 第十三节,基本数据类型,数字int字符串str
- 实验楼-1-Hello world!
- day38-多进程多线程-进程池
- Practice5.1 测试与封装5.1
- 20135202闫佳歆--week5 课本18章学习笔记
- SQL 存储过程中的IF_BEGIN_END作用域
- linux内存碎片防治技术
- Java Web编程的主要组件技术——Hibernate核心组件
- PHP面向对象(OOP)----访问限制符
热门文章
- ThinkPHP做自动登陆及异位或加密COOKIE!
- vue视频: 自定义指令 &;&; 拖拽 &;&; 自定义键盘信息
- 07.Curator计数器
- 在github上参与开源项目日常流程
- [NGINX] - 配置文件优化 - NGINX.CONF
- Windows安装使用git
- 洛谷 P2602 [ZJOI2010]数字计数
- Atom+Nuclide(Windows)开发ReactNative
- No &#39;Access-Control-Allow-Origin&#39; header is present on the requested resource. Origin &#39;null&#39; is therefore not allowed access.
- C++语言中的四种类型转换