洛谷:P2172 [国家集训队]部落战争
题目链接:
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 [国家集训队]部落战争相关推荐
- P2172 [国家集训队]部落战争 二分图最小不相交路径覆盖
二分图最小不相交路径覆盖 #include<bits/stdc++.h> using namespace std; const int MAXN = 5550; const int MAX ...
- 洛谷P2619 [国家集训队]Tree I 题解
洛谷P2619 [国家集训队]Tree I 题解 题目链接:P2619 [国家集训队]Tree I 题意: 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有 need\text{n ...
- 洛谷P1494 [国家集训队]小Z的袜子
P1494 [国家集训队]小Z的袜子 题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- ...
- 洛谷 P4643 [国家集训队]阿狸和桃子的游戏
题目:[国家集训队]阿狸和桃子的游戏 思路: 截个图,这个思路太巨了Orz. 图可以点.
- 洛谷P2839 [国家集训队]middle(主席树)
P2839 [国家集训队]middle 我们可以考虑二分中位数 checkcheckcheck 答案,那么我们对于某个值 midmidmid ,把 [l,r][l,r][l,r] 内的所有小于 mid ...
- 洛谷P2619 [国家集训队2]Tree I(带权二分,Kruscal,归并排序)
洛谷题目传送门 给一个比较有逼格的名词--WQS二分/带权二分/DP凸优化(当然这题不是DP). 用来解决一种特定类型的问题: 有\(n\)个物品,选择每一个都会有相应的权值,需要求出强制选\(nee ...
- [国家集训队]部落战争
题目大意:给出n*m的矩阵以及r,c.求最小路径覆盖. 本来是匈牙利算法裸题,网络流也可以跑一跑. 但是我先粘一个骗分大错解: #include<cstdio> #include<c ...
- 洛谷P4555 [国家集训队]最长双回文串(manacher 线段树)
题意 题目链接 Sol 我的做法比较naive..首先manacher预处理出以每个位置为中心的回文串的长度.然后枚举一个中间位置,现在要考虑的就是能覆盖到i - 1的回文串中 中心最靠左的,和能覆盖 ...
- 洛谷P1527 [国家集训队] 矩阵乘法 [整体二分,二维树状数组]
题目传送门 矩阵乘法 题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入输出格式 输入格式: 第一行两个数N,Q,表示矩阵大小和询问组数: 接下来N行N列一共N* ...
最新文章
- 性能测试回归测试_自动网站性能回归测试
- 回归模型和时间序列模型中的MAPE指标是什么?MAPE指标解读、MAPE越大越好还是越小越好、使用MAPE指标的注意事项
- 用typedef定义函数指针类型(转)
- 用python画圣诞树图片-节日快乐! Python画一棵圣诞树送给你
- CCNA200-120章节关系
- Collection接口详解
- 一起来看看java正则表达式
- Windows下mysql忘记root密码的解决方法
- html css js实现快递单打印_JS与HTML、CSS实现2048小游戏(六)
- 使用Infinispan作为持久性解决方案
- python 字符串编码解码和格式化问题
- WifiConfiguration 的各字段的填充和修改
- 通过数据,从键盘录入学生考试科目数,然后依次录入学的每一科分数.使用数组存储学生分数.然后输出总分,平均分,简单易理解
- 93. 复原IP地址
- perl语言入门:全局变量和私有变量
- 1047: 对数表 Java
- iPhone 记录之 点与像素
- [电影]《指环王》新老三部曲完全赏析(双塔)
- Winform:自定义滚动条——可自定义皮肤
- Disconnected:No supported authentication methods available
热门文章
- 渗透测试之后台查找,如何查找网站后台
- Android实战(MediaPlayer填坑)
- 设计模式系列:中介者模式
- 基于Springboot的大学生社团管理系统
- 开源DirectShow分析器和解码器: LAV Filter
- 遗传算法求解3D打印中零件二维排布问题(MATLAB实现)
- 病毒---手动删除Trojan.Miner.gbq病毒
- 舆情监测平台都有哪些,舆情监测平台使用工作总结
- 电脑怎么用计算机打开指令,快速打开电脑上的计算器
- 计算机桌面锁定怎么解除,电脑屏幕被锁定怎么解锁_电脑锁定屏幕如何取消-win7之家...