题目链接:

P2172 [国家集训队]部落战争 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

解题思路:

很明显的二分图:将原点与它能走到的点连一条边,然后做一遍最小点覆盖:即选出最少的军队可以走到所有的城镇:

最小点覆盖 = 总点数 - 最大匹配数:(若不知道的可以看看这篇博客:

(7条消息) 二分图及其多个扩展用法详解 + 模板题:算法竞赛进阶指南 关押罪犯 棋盘覆盖 机器任务 骑士放置 捉迷藏 + 洛谷:P2764 最小路径覆盖问题_wsh1931的博客-CSDN博客)

#include <cstdio>
#include <cstring>
#include <iostream>using namespace std;const int N = 55;int idx[N][N];
char map[N][N];
bool st[N * N];
int n, m, r, c;
int match[N * N];
bool graph[N * N][N * N];bool find(int a)//二分图模板
{for (int b = 1; b <= n * m; b ++ ){if (st[b]) continue;if (!graph[a][b]) continue;st[b] = true;if (match[b] == -1 || find(match[b])){match[b] = a;return true;}}return false;
}int main()
{memset(match, -1, sizeof match);cin >> n >> m >> r >> c;int dx[4] = {r, r, c, c};//枚举能走到的四个方向,注意只能往下走,因此int dy[4] = {c, -c, r, -r};//dx只能为正数for (int i = 1, t = 0; i <= n; i ++ )//将二维坐标(i, j)转化为一维坐标tfor (int j = 1; j <= m; j ++ )idx[i][j] = ++ t;for (int i = 1; i <= n; i ++ )//读入for (int j = 1; j <= m; j ++ )cin >> map[i][j];for (int i = 1; i <= n; i ++ )//枚举每个点的四个方向,并向(i, j)所能走到的(a, b)建图for (int j = 1; j <= m; j ++ )if (map[i][j] == '.')for (int k = 0; k < 4; k ++ ){int a = i + dx[k], b = j + dy[k];if (a < 1 || a > n || b < 1 || b > m || map[a][b] == 'x') continue;//判断边界graph[idx[i][j]][idx[a][b]] = true;//建图}int sum = 0, res = 0;for (int i = 1; i <= n; i ++ )//最小点覆盖模板for (int j = 1; j <= m; j ++ )if (map[i][j] == '.'){sum ++ ;int a = idx[i][j];memset(st, false, sizeof st);if (find(a)) res ++ ;}cout << sum - res << endl;//答案即为所有的点 - 最大匹配数return 0;
}

洛谷:P2172 [国家集训队]部落战争相关推荐

  1. P2172 [国家集训队]部落战争 二分图最小不相交路径覆盖

    二分图最小不相交路径覆盖 #include<bits/stdc++.h> using namespace std; const int MAXN = 5550; const int MAX ...

  2. 洛谷P2619 [国家集训队]Tree I 题解

    洛谷P2619 [国家集训队]Tree I 题解 题目链接:P2619 [国家集训队]Tree I 题意: 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有 need\text{n ...

  3. 洛谷P1494 [国家集训队]小Z的袜子

    P1494 [国家集训队]小Z的袜子 题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- ...

  4. 洛谷 P4643 [国家集训队]阿狸和桃子的游戏

    题目:[国家集训队]阿狸和桃子的游戏 思路: 截个图,这个思路太巨了Orz. 图可以点.

  5. 洛谷P2839 [国家集训队]middle(主席树)

    P2839 [国家集训队]middle 我们可以考虑二分中位数 checkcheckcheck 答案,那么我们对于某个值 midmidmid ,把 [l,r][l,r][l,r] 内的所有小于 mid ...

  6. 洛谷P2619 [国家集训队2]Tree I(带权二分,Kruscal,归并排序)

    洛谷题目传送门 给一个比较有逼格的名词--WQS二分/带权二分/DP凸优化(当然这题不是DP). 用来解决一种特定类型的问题: 有\(n\)个物品,选择每一个都会有相应的权值,需要求出强制选\(nee ...

  7. [国家集训队]部落战争

    题目大意:给出n*m的矩阵以及r,c.求最小路径覆盖. 本来是匈牙利算法裸题,网络流也可以跑一跑. 但是我先粘一个骗分大错解: #include<cstdio> #include<c ...

  8. 洛谷P4555 [国家集训队]最长双回文串(manacher 线段树)

    题意 题目链接 Sol 我的做法比较naive..首先manacher预处理出以每个位置为中心的回文串的长度.然后枚举一个中间位置,现在要考虑的就是能覆盖到i - 1的回文串中 中心最靠左的,和能覆盖 ...

  9. 洛谷P1527 [国家集训队] 矩阵乘法 [整体二分,二维树状数组]

    题目传送门 矩阵乘法 题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入输出格式 输入格式: 第一行两个数N,Q,表示矩阵大小和询问组数: 接下来N行N列一共N* ...

最新文章

  1. 性能测试回归测试_自动网站性能回归测试
  2. 回归模型和时间序列模型中的MAPE指标是什么?MAPE指标解读、MAPE越大越好还是越小越好、使用MAPE指标的注意事项
  3. 用typedef定义函数指针类型(转)
  4. 用python画圣诞树图片-节日快乐! Python画一棵圣诞树送给你
  5. CCNA200-120章节关系
  6. Collection接口详解
  7. 一起来看看java正则表达式
  8. Windows下mysql忘记root密码的解决方法
  9. html css js实现快递单打印_JS与HTML、CSS实现2048小游戏(六)
  10. 使用Infinispan作为持久性解决方案
  11. python 字符串编码解码和格式化问题
  12. WifiConfiguration 的各字段的填充和修改
  13. 通过数据,从键盘录入学生考试科目数,然后依次录入学的每一科分数.使用数组存储学生分数.然后输出总分,平均分,简单易理解
  14. 93. 复原IP地址
  15. perl语言入门:全局变量和私有变量
  16. 1047: 对数表 Java
  17. iPhone 记录之 点与像素
  18. [电影]《指环王》新老三部曲完全赏析(双塔)
  19. Winform:自定义滚动条——可自定义皮肤
  20. Disconnected:No supported authentication methods available

热门文章

  1. 渗透测试之后台查找,如何查找网站后台
  2. Android实战(MediaPlayer填坑)
  3. 设计模式系列:中介者模式
  4. 基于Springboot的大学生社团管理系统
  5. 开源DirectShow分析器和解码器: LAV Filter
  6. 遗传算法求解3D打印中零件二维排布问题(MATLAB实现)
  7. 病毒---手动删除Trojan.Miner.gbq病毒
  8. 舆情监测平台都有哪些,舆情监测平台使用工作总结
  9. 电脑怎么用计算机打开指令,快速打开电脑上的计算器
  10. 计算机桌面锁定怎么解除,电脑屏幕被锁定怎么解锁_电脑锁定屏幕如何取消-win7之家...