Hdu3360 National Treasures【最小点覆盖】

2024-04-24 10:20

本文主要是介绍Hdu3360 National Treasures【最小点覆盖】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

National Treasures

1

题意

一个 n × m n \times m n×m 的网格图,有若干个宝物,每个宝物有可能有一些关键位置(如上图的宝物,拥有 12 12 12 种关键位置中的 1 , 2 , 5 , 7 , 10 1,2,5,7,10 1,2,5,7,10
对于某个宝物,必须把它的所有关键位置都放置一个卫兵,网格图的某些位置可能已经有了卫兵

现在要求出为了满足要求,最少需要放置多少个卫兵?也可以将某个宝物换成卫兵,但是不能只删除宝物而不放卫兵

思路

我们将某个宝物与它的所有关键点连边,表示一种 守护 关系(如果这个位置已经有卫兵,那么不连边),那么对于最后形成的图,问题就转化成了:选择一些点,覆盖所有边(守护关系),也即是最小点覆盖

注意到如果一个宝物被换成了卫兵,那么等价于它的所有关键点都被覆盖了(所有守护关系都满足)

因此直接二分图跑最大匹配即可

#include<bits/stdc++.h>
#define fore(i,l,r)	for(int i=(int)(l);i<(int)(r);++i)
#define fi first
#define se second
#define endl '\n'
#define ull unsigned long long
#define ALL(v) v.begin(), v.end()
#define Debug(x, ed) std::cerr << #x << " = " << x << ed;const int INF=0x3f3f3f3f;
const long long INFLL=1e18;typedef long long ll;const int N = 55;int n, m;
int a[N][N]; //地图
int mv[12][2] = { //卫兵{-1, -2}, {-2, -1}, {-2, 1},{-1, 2}, {1, 2}, {2, 1},{2, -1}, {1, -2}, {-1, 0},{0, 1}, {1, 0}, {0, -1}
};std::vector<std::vector<int>> g;
std::vector<int> match;
std::vector<bool> used;bool in(int x, int y){return x >= 0 && x < n && y >= 0 && y < m;
}bool dfs(int u){for(auto v : g[u])if(!used[v]){used[v] = true;if(match[v] == -1 || dfs(match[v])){match[v] = u;return true;}}return false;
}int main(){std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::cout.tie(nullptr);int test = 0;while(std::cin >> n >> m && n && m){fore(i, 0, n)fore(j, 0, m)std::cin >> a[i][j];g.assign(n * m + 5, std::vector<int>());match.assign(n * m + 5, -1);fore(i, 0, n)fore(j, 0, m){if(a[i][j] == -1) continue;fore(k, 0, 12)if(a[i][j] >> k & 1){int x = i + mv[k][0], y = j + mv[k][1];if(in(x, y) && a[x][y] != -1){g[x * m + y].push_back(i * m + j);g[i * m + j].push_back(x * m + y);}}}int cnt = 0;fore(i, 0, n * m){used.assign(n * m + 5, false);cnt += dfs(i);}std::cout << ++test << ". " << cnt / 2 << endl;}return 0;
}

这篇关于Hdu3360 National Treasures【最小点覆盖】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/931484

相关文章

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

vue解决子组件样式覆盖问题scoped deep

《vue解决子组件样式覆盖问题scopeddeep》文章主要介绍了在Vue项目中处理全局样式和局部样式的方法,包括使用scoped属性和深度选择器(/deep/)来覆盖子组件的样式,作者建议所有组件... 目录前言scoped分析deep分析使用总结所有组件必须加scoped父组件覆盖子组件使用deep前言

Python绘制土地利用和土地覆盖类型图示例详解

《Python绘制土地利用和土地覆盖类型图示例详解》本文介绍了如何使用Python绘制土地利用和土地覆盖类型图,并提供了详细的代码示例,通过安装所需的库,准备地理数据,使用geopandas和matp... 目录一、所需库的安装二、数据准备三、绘制土地利用和土地覆盖类型图四、代码解释五、其他可视化形式1.

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

poj 1287 Networking(prim or kruscal最小生成树)

题意给你点与点间距离,求最小生成树。 注意点是,两点之间可能有不同的路,输入的时候选择最小的,和之前有道最短路WA的题目类似。 prim代码: #include<stdio.h>const int MaxN = 51;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int P;int prim(){bool vis[MaxN];

poj 2349 Arctic Network uva 10369(prim or kruscal最小生成树)

题目很麻烦,因为不熟悉最小生成树的算法调试了好久。 感觉网上的题目解释都没说得很清楚,不适合新手。自己写一个。 题意:给你点的坐标,然后两点间可以有两种方式来通信:第一种是卫星通信,第二种是无线电通信。 卫星通信:任何两个有卫星频道的点间都可以直接建立连接,与点间的距离无关; 无线电通信:两个点之间的距离不能超过D,无线电收发器的功率越大,D越大,越昂贵。 计算无线电收发器D

poj 1734 (floyd求最小环并打印路径)

题意: 求图中的一个最小环,并打印路径。 解析: ans 保存最小环长度。 一直wa,最后终于找到原因,inf开太大爆掉了。。。 虽然0x3f3f3f3f用memset好用,但是还是有局限性。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#incl

hdu 1102 uva 10397(最小生成树prim)

hdu 1102: 题意: 给一个邻接矩阵,给一些村庄间已经修的路,问最小生成树。 解析: 把已经修的路的权值改为0,套个prim()。 注意prim 最外层循坏为n-1。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstri

poj 2175 最小费用最大流TLE

题意: 一条街上有n个大楼,坐标为xi,yi,bi个人在里面工作。 然后防空洞的坐标为pj,qj,可以容纳cj个人。 从大楼i中的人到防空洞j去避难所需的时间为 abs(xi - pi) + (yi - qi) + 1。 现在设计了一个避难计划,指定从大楼i到防空洞j避难的人数 eij。 判断如果按照原计划进行,所有人避难所用的时间总和是不是最小的。 若是,输出“OPETIMAL",若

poj 2135 有流量限制的最小费用最大流

题意: 农场里有n块地,其中约翰的家在1号地,二n号地有个很大的仓库。 农场有M条道路(双向),道路i连接着ai号地和bi号地,长度为ci。 约翰希望按照从家里出发,经过若干块地后到达仓库,然后再返回家中的顺序带朋友参观。 如果要求往返不能经过同一条路两次,求参观路线总长度的最小值。 解析: 如果只考虑去或者回的情况,问题只不过是无向图中两点之间的最短路问题。 但是现在要去要回