P4304 [TJOI2013]攻击装置

题目描述

给定一个01矩阵,其中你可以在0的位置放置攻击装置。 每一个攻击装置(x,y)都可以按照“日”字攻击其周围的8个位置(x-1,y-2),(x-2,y-1),(x+1,y-2),(x+2,y-1),(x-1,y+2),(x-2,y+1),(x+1,y+2),(x+2,y+1)

求在装置互不攻击的情况下,最多可以放置多少个装置。

输入输出格式

输入格式:

第一行一个整数N,表示矩阵大小为N*N。

接下来N行每一行一个长度N的01串,表示矩阵。

输出格式:

一个整数,表示在装置互不攻击的情况下最多可以放置多少个装置。

输入输出样例

输入样例#1: 复制

3
010
000
100
输出样例#1: 复制

4

说明

30%数据N<=50

100%数据 N<=200


Solution

求最大点独立集,最大点独立集=点集-最大匹配

这道题因为是会相互连边,所以最后最大匹配数除以2就行了。

Code

#include<bits/stdc++.h>
using namespace std; struct Node {
int u, v, nex;
Node(int u = , int v = , int nex = ) :
u(u), v(v), nex(nex) { }
} Edge[]; int h[], stot;
void add(int u, int v) {
Edge[++stot] = Node(u, v, h[u]);
h[u] = stot;
} int n;
char s[][]; int zl[][] = {{-, -}, {-, -}, {, }, {, }, {, -}, {-, }, {-, }, {, -}};
int vis[], las[], to[], G[], id[][], t; bool dfs(int u) {
for(int i = h[u]; i; i = Edge[i].nex) {
int v = Edge[i].v;
if(vis[v] != t) {
vis[v] = t;
if(!las[v] || dfs(las[v])) {
las[v] = u; to[u] = v;
return ;
}
}
}
return ;
} bool pd(int x, int y) {
if(x < || y < || x > n || y > n || !G[id[x][y]]) return ;
return ;
} int main() {
int tot = , ans = ;
scanf("%d", &n);
for(int i = ; i <= n; i ++) scanf("%s", s[i] + );
for(int i = ; i <= n; i ++)
for(int j = ; j <= n; j ++) {
id[i][j] = (i - ) * n + j;
if(s[i][j] == '') G[id[i][j]] = , tot ++;
else G[id[i][j]] = ;
}
for(int i = ; i <= n; i ++)
for(int j = ; j <= n; j ++) {
if(!G[id[i][j]]) continue;
for(int k = ; k < ; k ++) {
int x = i + zl[k][], y = j + zl[k][];
if(!pd(x, y)) continue;
add(id[i][j], id[x][y] + n * n);
}
}
for(int i = ; i <= n * n; i ++)
if(!to[i] && G[i]) {
t ++;
ans += dfs(i);
}
printf("%d", tot - ans / );
return ;
}

P2172 [国家集训队]部落战争

题目描述

lanzerb的部落在A国的上部,他们不满天寒地冻的环境,于是准备向A国的下部征战来获得更大的领土。

A国是一个M*N的矩阵,其中某些地方是城镇,某些地方是高山深涧无人居住。lanzerb把自己的部落分成若干支军队,他们约定:

  1. 每支军队可以从任意一个城镇出发,并只能从上往向下征战,不能回头。途中只能经过城镇,不能经过高山深涧。

  2. 如果某个城镇被某支军队到过,则其他军队不能再去那个城镇了。

  3. 每支军队都可以在任意一个城镇停止征战。

  4. 所有军队都很奇怪,他们走的方法有点像国际象棋中的马。不过马每次只能走1*2的路线,而他们只能走R*C的路线。

lanzerb的野心使得他的目标是统一全国,但是兵力的限制使得他们在配备人手时力不从心。假设他们每支军队都能顺利占领这支军队经过的所有城镇,请你帮lanzerb算算至少要多少支军队才能完成统一全国的大业。

输入输出格式

输入格式:

第一行包含4个整数M、N、R、C,意义见问题描述。接下来M行每行一个长度为N的字符串。如果某个字符是'.',表示这个地方是城镇;如果这个字符时'x',表示这个地方是高山深涧。

输出格式:

输出一个整数,表示最少的军队个数。

输入输出样例

输入样例#1: 复制

3 3 1 2
...
.x.
...
输出样例#1: 复制

4
输入样例#2: 复制

5 4 1 1
....
..x.
...x
....
x...
样例输出
输出样例#2: 复制

5

说明

100%的数据中,1<=M,N<=50,1<=R,C<=10。


Solution

比较轻松地可以想到最小路径覆盖问题,用最少的路径,经过所有点。

二分图是经典方法,每个点拆点,两点间有连边就在二分图上连边,最小路径=总点数-最大匹配。可以理解为,每一个匹配,就省去了一条路径(以入点为起点的路径可以由出点直接到达),所以最大匹配省去的路径是最多的。

最大匹配也可以用网络流实现。

注意空间....

Code

#include<bits/stdc++.h>
using namespace std; int G[][], n, m, r, c;
int zl[][] = {{, }, {, -}}; struct Node {
int u, v, nex;
Node(int u = , int v = , int nex = ) :
u(u), v(v), nex(nex) { }
} Edge[]; int h[], stot;
void add(int u, int v) {
Edge[++stot] = Node(u, v, h[u]);
h[u] = stot;
} bool check(int x, int y) {
if(x < || y < || x > m || y > n || !G[x][y]) return ;
return ;
} int las[], to[], vis[];
bool dfs(int u) {
for(int i = h[u]; i; i = Edge[i].nex) {
int v = Edge[i].v;
if(!vis[v]) {
vis[v] = ;
if(!las[v] || dfs(las[v])) {
to[u] = v; las[v] = u;
return ;
}
}
}
return ;
} int id[][], ans, tot;
char s[][];
int main() {
scanf("%d%d%d%d\n", &m, &n, &r, &c);
for(int i = ; i <= m; i ++) scanf("%s", s[i] + );
for(int i = ; i <= m; i ++) {
for(int j = ; j <= n; j ++) {
id[i][j] = (i - ) * n + j;
if(s[i][j] == '.') G[i][j] = , tot ++;
else G[i][j] = ;
}
}
for(int i = ; i <= m; i ++)
for(int j = ; j <= n; j ++) {
if(!G[i][j]) continue;
int x, y;
for(int k = ; k < ; k ++) {
x = i + zl[k][] * r, y = j + zl[k][] * c;
if(!check(x, y)) continue;
add(id[i][j], id[x][y] + n * m);
}
if(r != c) {
for(int k = ; k < ; k ++) {
x = i + zl[k][] * c, y = j + zl[k][] * r;
if(!check(x, y)) continue;
add(id[i][j], id[x][y] + n * m);
}
}
}
for(int i = ; i <= m; i ++) {
for(int j = ; j <= n; j ++)
if(!to[id[i][j]] && G[i][j]) {
memset(vis, , sizeof(vis));
ans += dfs(id[i][j]);
}
}
printf("%d", tot - ans);
return ;
}

【洛谷】4304:[TJOI2013]攻击装置【最大点独立集】【二分图】2172: [国家集训队]部落战争【二分图/网络流】【最小路径覆盖】的更多相关文章

  1. 洛谷P4304 [TJOI2013]攻击装置 题解

    题目链接: https://www.luogu.org/problemnew/show/P4304 分析: 最大独立集 最大独立集=总点数-最大匹配数 独立集:点集,图中选一堆点,这堆点两两之间没有连 ...

  2. 洛谷P4304 TJOI2013 攻击装置 (二分图匹配)

    题目大意:一个矩阵,一些点被拿掉,在棋盘上马走日,马之间不能落在同一点,求最多放几匹马. 采用对矩阵黑白染色,画个图可以发现:马可以走到的位置和他所处的位置颜色不同,将马和他可以走到的位置连边,最多可 ...

  3. 洛谷P2172 [国家集训队]部落战争 题解

    题目链接:https://www.luogu.org/problemnew/show/P2172 分析: 不要被[国家集训队]的标签吓到,其实这题不是很难. 本题可以对比P4304 [TJOI2013 ...

  4. 国家集训队 部落战争 网络流最小路径覆盖 洛谷P2172

    洛谷AC传送门! step1: 题目大意 有一张M x N的网格图,有一些点为“ * ”可以走,有一些点为“ x ”不能走,每走一步你都可以移动R * C 个格子(参考象棋中马的走法),且不能回头,已 ...

  5. 洛咕 P4304 [TJOI2013]攻击装置

    把坐标按照(x+y)%2染色可以发现这是个二分图 二分图最大独立集=点数-最大匹配 于是就是个算匹配的傻逼题了 // luogu-judger-enable-o2 #include<bits/s ...

  6. 洛谷P4003 [国家集训队2017]无限之环 网络流 最小费用最大流

    题意简述 有一个\(n\times m\)棋盘,棋盘上每个格子上有一个水管.水管共有\(16\)种,用一个\(4\)位二进制数来表示当前水管向上.右.下.左有个接口.你可以旋转除了\((0101)_2 ...

  7. BZOJ3175: [Tjoi2013]攻击装置

    题解: 最大点独立集...好像水过头了... 不过发现我二分图好像忘完了!!! 代码: #include<cstdio> #include<cstdlib> #include& ...

  8. BZOJ 3175: [Tjoi2013]攻击装置( 匈牙利 )

    黑白染成二分图, 然后不能同时选的就连边, 最大匹配数为m, t为不能放的数目, 则题目所求最大点独立集为 n*n-m-t -------------------------------------- ...

  9. 【BZOJ4808/3175】马/[Tjoi2013]攻击装置 最小割

    [BZOJ4808]马 Description 众所周知,马后炮是中国象棋中很厉害的一招必杀技."马走日字".本来,如果在要去的方向有别的棋子挡住(俗称"蹩马腿" ...

随机推荐

  1. required_new spring事务传播行为无效碰到的坑!

    在测试事务传播行为的时候,因为用了同一个service中的方法测试,所以不管怎么设置都无效了: 原因是aop动态代理只会拦截一次执行方法,第二个方法是照搬的,只要调用其他service中的事务方法,传 ...

  2. 金蝶K3物料选择问题(感觉Ctrl被按住了一样)

    金蝶K3在进入物料选择时,有时需要用Ctrl才可以进行多选,为什么有时不用Ctrl也可以进行多选,就像Ctrl被按住了一样? 解决:在物料选择界面按2次ctrl键单击物料可实现多选,再按2次ctrl则 ...

  3. mysql状态查看 QPS/TPS/缓存命中率查看【转】

    运行中的mysql状态查看   对正在运行的mysql进行监控,其中一个方式就是查看mysql运行状态.    (1)QPS(每秒Query量)  QPS = Questions(or Queries ...

  4. SQL自定义排序 ORDER BY

    将id为30002 排在最前面 50第二 其他 不变 SELECT TOP 10 * FROM [表名] t1 ORDER BY case t1.ID when 30002 then 0 WHEN 5 ...

  5. 三、springboot热部署

    1.spring-boot-devtools 实现热部署 spring-boot-devtools 最重要的功能就是热部署.它会监听 classpath 下的文件变动,并且会立即重启应用. <d ...

  6. 目标板通过nfs挂载根文件系统

    目标板挂载根文件系统的方法有两种(这里所说的服务端就是ubuntu,Ubuntu已经成功安装了nfs服务,并且保证服务端与目标板ping 通) 第一种:等待开发板启动之后去挂载,此时文件系统从Flas ...

  7. html-介绍

    一:概述 HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,他是一种制作万维网页面标准语言(标记).相当于定义统一的一套规则,大家都来遵守他,这样就可以让浏 ...

  8. springMVC源码分析--HttpMessageConverter参数read操作(二)

    上一篇博客springMVC源码分析--HttpMessageConverter数据转化(一)中我们简单介绍了一下HttpMessageConverter接口提供的几个方法,主要有以下几个方法: (1 ...

  9. MySQL通过rpm安装及其单机多实例部署

    1. CentOS 下安装 MySQL Oracle 收购 MySQL 后,CentOS 为避免 MySQL 闭源的风险,改用 MySQL 的分支 MariaDB:MariaDB 完全兼容 MySQL ...

  10. CVE-2014-1776 秘狐

    传说中的IE秘狐 [CNNVD]Microsoft Internet Explorer 释放后重用漏洞(CNNVD-201404-530) Microsoft Internet Explorer(IE ...