toj 4061 矩阵攻击(最大独立集)
题目:
给定一个01 矩阵,其中你可以在0的位置放置攻击装置。每一个攻击装置 (x,y) 都可以按照“日”字攻击其周围八个位置(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 串,表示矩阵。(N <= 200)
输出
一个整数,表示在装置不相互攻击的情况下最多可以放置多少个装置。
样例输入
3
010
000
100
样例输出
4
分析:通过画图来分析,假设在左上角放置攻击装置,忽略障碍,标记出可以其他可以放置跟不可以放置装置的位置,会发现他们是交替出现的;如果把x和y坐标和为奇数的位置归为一类,为偶数的归为一类,则在同类位置间任意放置装置时不会相互攻击,在两类位置分别放置攻击装置时,可能相互攻击。至此,此题二分图的特征已经相当明显了,是个求解最大独立集的问题。
代码如下(通过此题发现vector存图好慢,跟手写的结构体相比,差了不止一点,以后还是尽量少用vector存图):
#include <cstdio>
#include <cstring>
using namespace std;
#define N 205 //发现用vector 存图好慢呀
struct Edge{
int v, next;
}edge[N*N*];
int Ecnt;
int head[N*N]; char mp[N][N];
int id[N][N];
int n;
int go[][] = {{-,}, {-,}, {,}, {,}}; int link[N*N];
bool visited[N*N]; void add(int u, int v)
{
edge[Ecnt].v = v, edge[Ecnt].next = head[u], head[u] = Ecnt++;
edge[Ecnt].v = u, edge[Ecnt].next = head[v], head[v] = Ecnt++;
} bool find(int u)
{
for(int i = head[u]; i != -; i = edge[i].next)
{
int v = edge[i].v;
if(visited[v]) continue;
visited[v] = true;
if(link[v] == - || find(link[v]))
{
link[v] = u;
return true;
}
}
return false;
} int solve()
{
int m = (n*n+)>>, c = n*n;
memset(link, -, sizeof(link));
int res = ;
for(int i = ; i < m; i++)
{
memset(visited, , sizeof(visited));
if(find(i)) res++;
}
return res;
} int main()
{
while(~scanf("%d", &n))
{
int m = (n*n+)/;
memset(head, -, sizeof(head));
Ecnt = ;
for(int i = ; i < n; i++) scanf("%s", mp[i]);
int cnt = ;
for(int i = ; i < n; i++)
for(int j = ; j < n; j++)
cnt += (mp[i][j] == '');
int c0 = , c1 = (n*n+)>>;
for(int i = ; i < n; i++)
for(int j = ; j < n; j++)
id[i][j] = ((i+j)&) ? c1++ : c0++;
for(int i = ; i < n; i++)
{
for(int j = ; j < n; j++)
{
if(mp[i][j] == '')
{
int nx, ny;
for(int k = ; k < ; k++)
{
nx = i+go[k][], ny = j+go[k][];
if(nx >= && nx < n && ny >= && ny < n && mp[nx][ny] == '')
add(id[i][j], id[nx][ny]);
}
}
}
}
printf("%d\n", n*n-cnt-solve());
}
return ;
}
toj 4061 矩阵攻击(最大独立集)的更多相关文章
- [ACM] FZU 1686 神龙的难题 (DLX 反复覆盖)
Problem 1686 神龙的难题 Accept: 444 Submit: 1365 Time Limit: 1000 mSec Memory Limit : 32768 KB Pro ...
- BZOJ3175:[TJOI2013]攻击装置(二分图最大独立集)
Description 给定一个01矩阵,其中你可以在0的位置放置攻击装置.每一个攻击装置(x,y)都可以按照“日”字攻击其周围的 8个位置(x-1,y-2),(x-2,y-1),(x+1,y-2), ...
- 【最大独立集】BZOJ3175- [Tjoi2013]攻击装置
[题目大意] 给定一个01矩阵,其中你可以在0的位置放置攻击装置.每一个攻击装置(x,y)都可以按照“日”字攻击其周围的 8个位置(x-1,y-2),(x-2,y-1),(x+1,y-2),(x+2, ...
- BZOJ3175[Tjoi2013]攻击装置——二分图最大独立集
题目描述 给定一个01矩阵,其中你可以在0的位置放置攻击装置.每一个攻击装置(x,y)都可以按照“日”字攻击其周围的 8个位置(x-1,y-2),(x-2,y-1),(x+1,y-2),(x+2,y- ...
- P3355 骑士共存问题【洛谷】(二分图最大独立集变形题) //链接矩阵存图
展开 题目描述 在一个 n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上某些方格设置了障碍,骑士不得进入 对于给定的 n*n 个方格的国际象棋棋盘和障碍标志,计算棋盘上最多可 ...
- 【刷题】BZOJ 3175 [Tjoi2013]攻击装置
Description 给定一个01矩阵,其中你可以在0的位置放置攻击装置.每一个攻击装置(x,y)都可以按照"日"字攻击其周围的 8个位置(x-1,y-2),(x-2,y-1), ...
- BZOJ 3175: [Tjoi2013]攻击装置
捉水题真是捉上瘾了TUT Description 给定一个01矩阵,其中你可以在0的位置放置攻击装置.每一个攻击装置(x,y)都可以按照“日”字攻击其周围的 8个位置(x-1,y-2),(x-2,y- ...
- BZOJ_3175_[Tjoi2013]攻击装置_二分图匹配
BZOJ_3175_[Tjoi2013]攻击装置_二分图匹配Description 给定一个01矩阵,其中你可以在0的位置放置攻击装置.每一个攻击装置(x,y)都可以按照“日”字攻击其周围的 8个位置 ...
- 【BZOJ-1898】Swamp 沼泽鳄鱼 矩阵乘法
1898: [Zjoi2005]Swamp 沼泽鳄鱼 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1012 Solved: 566[Submit][S ...
随机推荐
- [CSP-S模拟测试]:太阳神(莫比乌斯反演)
题目描述 太阳神拉很喜欢最小公倍数,有一天他想到了一个关于最小公倍数的题目.求满足如下条件的数对$(a,b)$对数:$a,b$均为正整数且$a,b\leqslant n$而$lcm(a,b)>n ...
- FCC 成都社区·前端周刊 第 10 期
1. Node.js 10 正式发布 在过去的一周,Node.js 10.0.0 正式发布,带来大量改进和修复.这是自 Node.js Foundation 开展以来的第七个主要版本,并将在 2018 ...
- 音悦台 api分析
用户订阅MV更新 http://uapi.yinyuetai.com/i/flw/subscribe-video-list?page=1&pageSize=200&uid=XXXXXX ...
- (转)Installing Cloudera Manager and CDH
转:https://blog.csdn.net/qq_26222859/article/details/79976506 译自官网: Installing Cloudera Manager and C ...
- hdu6570Wave (暴力求解)
Problem Description Avin is studying series. A series is called "wave" if the following co ...
- PA动画使用教程
1.动画复制与动画粘贴.动画删除 PA的动画复制.动画粘贴不会覆盖原有动画: PPT自带的动画刷会覆盖原有动画: 注意: 超级属性的动画复制.粘贴有bug,应使用自带的动画刷: PA动画的复制.粘贴只 ...
- mybatis动态注解sql编写注意事项
最近在编写mybatis的动态注解sql遇到了不少的坑,在网上看到一篇讲的比较详细的文章,记录一下: https://mbd.baidu.com/newspage/data/landingshare? ...
- 9、numpy——数组操作
Numpy 中包含了一些函数用于处理数组,大概可分为以下几类: (1)修改数组形状 (2)翻转数组 (3)修改数组维度 (4)连接数组 (5)分割数组 (6)数组元素的添加与删除 1.修改数组形状 函 ...
- 2.maven 安装配置
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/huangbin10025/article/details/24518577 System Requ ...
- 标签的增加、删除与复制,动态标签js不生效的解决
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...