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

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

-------------------------------------------------------------------------

#include<cstdio>

#include<cstring>

#include<algorithm>

using namespace std;

const int maxn = 209;

const int dir[8][2] = {{-1, -2}, {-2, -1}, {1, -2},

{2, -1}, {-1, 2}, {-2, 1},

{1, 2}, {2, 1}};

struct edge {

int to;

edge* next;

} E[maxn * maxn * 8], *pt = E, *head[maxn * maxn];

void addedge(int u, int v) {

pt->to = v; pt->next = head[u]; head[u] = pt++;

}

char str[maxn][maxn];

int N, vis[maxn * maxn], C, match[maxn * maxn], ans;

int Id(int x, int y) {

return x * N + y;

}

bool dfs(int x) {

for(edge* e = head[x]; e; e = e->next) if(vis[e->to] != C) {

vis[e->to] = C;

if(!~match[e->to] || dfs(match[e->to])) {

match[e->to] = x;

return true;

}

}

return false;

}

bool checkY(int x, int y) {

return (x + y) & 1;

}

void init() {

scanf("%d", &N);

ans = N * N;

for(int i = 0; i < N; i++) scanf("%s", str[i]);

for(int i = 0; i < N; i++) {

for(int j = 0; j < N; j++) if(str[i][j] == ‘0‘) {

int id = Id(i, j);

if(!checkY(i, j)) {

for(int k = 0; k < 8; k++) {

int x = i + dir[k][0], y = j + dir[k][1];

if(x >= 0 && x < N && y >= 0 && y < N && str[x][y] == ‘0‘ && checkY(x, y))

addedge(id, Id(x, y));

}

}

} else

ans--;

}

}

void work() {

memset(match, -1, sizeof match);

memset(vis, -1, sizeof vis);

int lim = N * N;

for(C = 0; C < lim; C++) if(dfs(C)) ans--;

printf("%d\n", ans);

}

int main() {

init();

work();

return 0;

}

-------------------------------------------------------------------------

3175: [Tjoi2013]攻击装置

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 754  Solved: 362
[Submit][Status][Discuss]

Description

给定一个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)
求在装置互不攻击的情况下,最多可以放置多少个装置。

Input

第一行一个整数N,表示矩阵大小为N*N。接下来N行每一行一个长度N的01串,表示矩阵。

Output

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

Sample Input

3
010
000
100

Sample Output

4

HINT

100%数据 N<=200

Source

时间: 2024-10-10 02:33:52

BZOJ 3175: [Tjoi2013]攻击装置( 匈牙利 )的相关文章

BZOJ 3175 Tjoi2013 攻击装置 二分图最大匹配

题目大意:给定一个n*n的网格图,要在0的位置上放置一些攻击装置,其中一个攻击装置的攻击范围是周围8个"日"字形区域,要求不能互相攻击,求最多放置多少个攻击装置 每两个能互相攻击且能放置的点连一条双向边,然后跑二分图最大点独立集即可 4W个点n^2居然没TLE 是数据太弱还是匈牙利算法太强了? #include<cstdio> #include<cstring> #include<iostream> #include<algorithm>

3175. [TJOI2013]攻击装置【二分图最大独立集】

Description 给定一个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) 求在装置互不攻击的情况下,最多可以放置多少个装置. Input 第一行一个整数N,表示矩阵大小为N*N.接下来N行每一行一个长度N的01串,表示矩阵. Output 一个整数,表示在装置互不攻击的情

[TJOI2013] 攻击装置

3175: [Tjoi2013]攻击装置 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1326  Solved: 636[Submit][Status][Discuss] Description 给定一个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

bzoj4808: 马 &amp; bzoj3175: [Tjoi2013]攻击装置 (黑白染色+最小割)

bzoj4808: 马 & bzoj3175: [Tjoi2013]攻击装置 题目:传送门 简要题意: 和n皇后问题差不多,但是这里是每个棋子走日子,而且有些格子不能放棋子.求最多能放多少个棋子. 题解: 双倍经验好评 之前看过机房神犇做...有点印象是最小割. 但是直接割的话不会...要应用到黑白染色: 最开始我想递归染色,也就是取一个开始染,然后递归下去... 波老师说会错ORZ...因为感觉递归的情况不好掌握,有可能会重复染色... 结果有一个肥肠巧妙的方法...直接相邻的染为不同颜色 之

BZOJ3175 [Tjoi2013]攻击装置

Description 给 定一个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) 求在装置互不攻击的情况下,最多可以放置多少个装置. Input 第一行一个整数N,表示矩阵大小为N*N.接下来N行每一行一个长度N的01串,表示矩阵. Output 一个整数,表示在装置互不攻击的

BZOJ4808: 马&amp;BZOJ3175: [Tjoi2013]攻击装置

BZOJ3175 Description 给定一个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)求在装置互不攻击的情况下,最多可以放置多少个装置. Input 第一行一个整数N,表示矩阵大小为N*N.接下来N行每一行一个长度N的01串,表示矩阵. Output 一个整数,表示在

【bzoj3175】[Tjoi2013]攻击装置

每两个能互相攻击且能放置的点连一条双向边,然后跑二分图最大点独立集即可 #include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<cmath> using namespace std; typedef long long LL; #define M 80010 #define N 210 st

bzoj3175: [Tjoi2013]攻击装置&amp;&amp;4808: 马

终于知道为啥网络流这么受欢迎了. 其实就是构个图模板一下的事儿,比较好打是吧. 然后这题网络流黑白染色(其实感觉上匈牙利更加直接好想啊,但是实际上黑白染色给人感觉就是二分图) st连白而ed连黑,流量为1 不能同时出现的就建无限流量的边 然后sum-最小割 #include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #inc

【最大独立集】BZOJ3175- [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).求在装置互不攻击的情况下,最多可以放置多少个装置. [思路] 最大独立集=总点数-最大二分图匹配 我们都知道最大独立集一般用在二分图里…所以把每个点看作两个点,一个是从它出发,一个是抵达它.实际操作的时候因为