[TJOI2013]攻击装置(网络流,最小割)
前言
网络流被hbx吊起来打
Solution
考虑一下这个走法是不是和象棋中马的走法一模一样(废话)
那么显然我每一次移动是走三次,如果将棋盘二分图染色一下,不就是每一次只能走到另一个颜色的吗?
然后我们题目中求的是最多可以放置多少个装置,不能够攻击,也就是一个裸的二分图最小割?
直接最大流求一下做个减法就没了。
代码实现
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#include<iostream>
using namespace std;
#define ll long long
#define re register
#define file(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout)
inline int gi(){
int f=1,sum=0;char ch=getchar();
while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0' && ch<='9'){sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();}
return f*sum;
}
const int N=100010,M=300010,Inf=1e9+10;
int front[N],nxt[M<<1],s,t,cnt,to[M<<1],w[M<<1],dep[N],n,m,a[510][510],num[510][510],cur[N];
int wa[9]={0,1,1,2,2,-1,-1,-2,-2};
int lk[9]={0,2,-2,1,-1,2,-2,1,-1};
void Add(int u,int v,int val){
to[cnt]=v;nxt[cnt]=front[u];front[u]=cnt;w[cnt++]=val;
}
bool bfs(){
queue<int>Q;while(!Q.empty())Q.pop();memset(dep,0,sizeof(dep));
Q.push(s);dep[s]=1;
while(!Q.empty()){
int u=Q.front();Q.pop();
for(int i=front[u];i!=-1;i=nxt[i]){
int v=to[i];
if(!dep[v] && w[i]){
dep[v]=dep[u]+1;Q.push(v);
}
}
}
return dep[t];
}
int dfs(int u,int Flow){
if(u==t || !Flow)return Flow;
for(int &i=cur[u];i!=-1;i=nxt[i]){
int v=to[i];
if(dep[v]==dep[u]+1 && w[i]){
int di=dfs(v,min(Flow,w[i]));
if(di){
w[i]-=di;w[i^1]+=di;return di;
}
else dep[v]=0;
}
}
return 0;
}
int Dinic(){
int Flow=0;
while(bfs()){
for(int i=s;i<=t;i++)cur[i]=front[i];
while(int d=dfs(s,Inf))Flow+=d;
}
return Flow;
}
int main(){
n=gi();s=0,t=n*n+1;memset(front,-1,sizeof(front));
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
char ch=getchar();
while(ch!='1' && ch!='0')ch=getchar();
if(ch=='1')a[i][j]=1,m++;
}
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)num[i][j]=(i-1)*n+j;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(!a[i][j]){
int color=(i+j)%2;
if(color){//黄色
Add(s,num[i][j],1);Add(num[i][j],s,0);
for(int k=1;k<=8;k++){
int x=i+wa[k],y=j+lk[k];
if(x>0 && x<=n && y>0 && y<=n && !a[x][y]){
Add(num[i][j],num[x][y],Inf);Add(num[x][y],num[i][j],0);
}
}
}
else{Add(num[i][j],t,1);Add(t,num[i][j],0);}
}
printf("%d\n",n*n-Dinic()-m);
return 0;
}
[TJOI2013]攻击装置(网络流,最小割)的更多相关文章
- 【洛谷】4304:[TJOI2013]攻击装置【最大点独立集】【二分图】2172: [国家集训队]部落战争【二分图/网络流】【最小路径覆盖】
P4304 [TJOI2013]攻击装置 题目描述 给定一个01矩阵,其中你可以在0的位置放置攻击装置. 每一个攻击装置(x,y)都可以按照“日”字攻击其周围的8个位置(x-1,y-2),(x-2,y ...
- 【BZOJ4808/3175】马/[Tjoi2013]攻击装置 最小割
[BZOJ4808]马 Description 众所周知,马后炮是中国象棋中很厉害的一招必杀技."马走日字".本来,如果在要去的方向有别的棋子挡住(俗称"蹩马腿" ...
- bzoj4808: 马 & bzoj3175: [Tjoi2013]攻击装置 (黑白染色+最小割)
bzoj4808: 马 & bzoj3175: [Tjoi2013]攻击装置 题目:传送门 简要题意: 和n皇后问题差不多,但是这里是每个棋子走日子,而且有些格子不能放棋子.求最多能放多少个棋 ...
- BZOJ3175: [Tjoi2013]攻击装置
题解: 最大点独立集...好像水过头了... 不过发现我二分图好像忘完了!!! 代码: #include<cstdio> #include<cstdlib> #include& ...
- BZOJ 3175: [Tjoi2013]攻击装置( 匈牙利 )
黑白染成二分图, 然后不能同时选的就连边, 最大匹配数为m, t为不能放的数目, 则题目所求最大点独立集为 n*n-m-t -------------------------------------- ...
- 【题解】 bzoj3894: 文理分科 (网络流/最小割)
bzoj3894,懒得复制题面,戳我戳我 Solution: 首先这是一个网络流,应该还比较好想,主要就是考虑建图了. 我们来分析下题面,因为一个人要么选文科要么选理科,相当于两条流里面割掉一条(怎么 ...
- 【bzoj3774】最优选择 网络流最小割
题目描述 小N手上有一个N*M的方格图,控制某一个点要付出Aij的代价,然后某个点如果被控制了,或者他周围的所有点(上下左右)都被控制了,那么他就算是被选择了的.一个点如果被选择了,那么可以得到Bij ...
- 【bzoj1143】[CTSC2008]祭祀river Floyd+网络流最小割
题目描述 在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在水面上,奉龙王为神.每逢重大庆典, Y族都会在水面上举办盛大的祭祀活动.我们可以把Y族居住地水系看成一个由岔口和河道组成的网络.每条河 ...
- 【BZOJ 3175】 3175: [Tjoi2013]攻击装置(二分图匹配)
3175: [Tjoi2013]攻击装置 Description 给定一个01矩阵,其中你可以在0的位置放置攻击装置.每一个攻击装置(x,y)都可以按照“日”字攻击其周围的 8个位置(x-1,y-2) ...
- 【bzoj1797】[Ahoi2009]Mincut 最小割 网络流最小割+Tarjan
题目描述 给定一张图,对于每一条边询问:(1)是否存在割断该边的s-t最小割 (2)是否所有s-t最小割都割断该边 输入 第一行有4个正整数,依次为N,M,s和t.第2行到第(M+1)行每行3个正 整 ...
随机推荐
- runloop 和 CFRunLoop - 定时器 - NSTimer 和 GCD定时器
1. 2. #import "ViewController.h" @interface ViewController () @property (nonatomic, strong ...
- [leetcode]543. Diameter of Binary Tree二叉树直径
Given a binary tree, you need to compute the length of the diameter of the tree. The diameter of a b ...
- [leetcode]173. Binary Search Tree Iterator 二叉搜索树迭代器
Implement an iterator over a binary search tree (BST). Your iterator will be initialized with the ro ...
- Windows10 Virtualization Technology虚拟化技术功能
为什么要开启VT功能,做机器学习环境搭建.运用Docker容器等等,所以首先要确认一下机器是否已经开启了VT技术功能,以此记录一下经历而已. VT是什么?为什么要开启VT?VT是一种虚拟化技术,可以扩 ...
- 由已打开的文件读取数据---read
头文件:#include<unistd.h> 函数原型:ssize_t read(int fd,void *buf,size_t count); 参数说明:fd:文件描述符 buf:存放读 ...
- 创建WRAPPER时, SQL20076N 未对指定的操作启用数据库的实例。
您可以通过运行DB2 UPDATE DBM CFG USING FEDERATED YES来设置这个参数.修改这个参数后,必须重新启动实例才会生效(DB2STOP/DB2START).所以你会出现你的 ...
- memcached 连接本地问题
刚开始学memcache ,就遇到一个问题. telnet 127.0.0.1 11211 回车之后就什么都没有提示了.然后不管设置什么都是报error . 表示不知道如何解决!先写个文章记录下来 ...
- 如何配置JDK?
有很多人,java都下载好,却因不会配置JDK,而无法编程.今天巩固就来教大家配置JDK. 第一步:将下载好的java放在D盘(最好不要占用C盘). 第二步:右击我的电脑,选择"属性 ...
- 一个简单的Linux后门程序的实现
该程序实质是一个简单的socket编程,在受害方上运行攻击代码(后门进程),通过socket打开一个预设端口,并监听,等待攻击方的链接.一旦攻击方通过网络链接工具试图链接该socket,那么后门进程立 ...
- Java带图片预览功能的图片上传兼容火狐ie
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...