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 ;
}

最新文章

  1. SpringBoot配置属性之DataSource
  2. [IPA]IOS In App Purchase(内购)验证
  3. BZOJ 4423: [AMPPZ2013]Bytehattan
  4. 优秀Python学习资源收集汇总(强烈推荐)
  5. JQ例子:旋转木马
  6. Chrome模拟手机浏览网页
  7. PHYLIP linux安装
  8. Spark.ML之PipeLine学习笔记
  9. 【转载】CentOS日志系统组成详解
  10. 祖国版SoloWheel:Airwheel爱尔威火星车 拆箱&amp;上手经验_运动户外_晒物广场_什么值得买
  11. Google Dataflow
  12. 第十三节,基本数据类型,数字int字符串str
  13. 实验楼-1-Hello world!
  14. day38-多进程多线程-进程池
  15. Practice5.1 测试与封装5.1
  16. 20135202闫佳歆--week5 课本18章学习笔记
  17. SQL 存储过程中的IF_BEGIN_END作用域
  18. linux内存碎片防治技术
  19. Java Web编程的主要组件技术——Hibernate核心组件
  20. PHP面向对象(OOP)----访问限制符

热门文章

  1. ThinkPHP做自动登陆及异位或加密COOKIE!
  2. vue视频: 自定义指令 &amp;&amp; 拖拽 &amp;&amp; 自定义键盘信息
  3. 07.Curator计数器
  4. 在github上参与开源项目日常流程
  5. [NGINX] - 配置文件优化 - NGINX.CONF
  6. Windows安装使用git
  7. 洛谷 P2602 [ZJOI2010]数字计数
  8. Atom+Nuclide(Windows)开发ReactNative
  9. No &#39;Access-Control-Allow-Origin&#39; header is present on the requested resource. Origin &#39;null&#39; is therefore not allowed access.
  10. C++语言中的四种类型转换