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 ...
随机推荐
- 使用随机森林实现OSM路网城市多车道信息提取
Multilane roads extracted from the OpenStreetMap urban road network using random forests.,DOI:10.111 ...
- Zball in Tina Town
Zball in Tina Town Accepts: 356 Submissions: 2463 Time Limit: 3000/1500 MS (Java/Others) Memory ...
- React Hook:使用 useEffect
React Hook:使用 useEffect 一.描述 二.需要清理的副作用 1.在 class 组件中 2.使用 effect Hook 的示例 1.useEffect 做了什么? 2.为什么在组 ...
- 前端每日实战:6# 视频演示如何用纯 CSS 绘制一颗闪闪发光的璀璨钻石
效果预览 按下右侧的"点击预览"按钮在当前页面预览,点击链接全屏预览. https://codepen.io/zhang-ou/pen/qYqwQp 可交互视频教程 此视频是可以交 ...
- Day1 方法的重载
方法的重载 方法的标识符包括: 1.方法名称 2.方法的参数(参数类型和参数的数量) 方法的重载:方法名称相同 但是方法参数不同(1.参数类型不同 2.参数类型相同 但是参数个数不同 3.类型和个 ...
- 黑马lavarel教程---2、获取用户输入
黑马lavarel教程---2.获取用户输入 一.总结 一句话总结: lavarel中获取用户输入可以通过Input外观模式和Request外观模式,两者的对应的方法啥的都一样,比如get.all.o ...
- QT_study
https://blog.csdn.net/a313827758/article/details/72736552 https://blog.csdn.net/xbcreal/article/deta ...
- CDN:BootCDN 项目列表-摘录-20180405
ylbtech-CDN:BootCDN 项目列表-20180405 1.返回顶部 1. 2. 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 1. http://www.boo ...
- mysql之存储过程基础篇
1. 创建/使用数据库 mysql> create database me; mysql> use me; 2. 创建表 mysql> create table Stu(Sno ...
- 写的一个双向链表,测试OK
#include <stdio.h> #include <stdlib.h> #include <assert.h> typedef struct DoubleLi ...