[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个正 整 ...
随机推荐
- C#.net随机数函数
(1)Random rnd = new Random(); int rndNum = rnd.Next(); //int 取值范围内的随机数 int rndNum = rnd.Ne ...
- 理解数据结构Priority Queue
我们知道Queue是遵循先进先出(First-In-First-Out)模式的,但有些时候需要在Queue中基于优先级处理对象.举个例子,比方说我们有一个每日交易时段生成股票报告的应用程序,需要处理大 ...
- jdk8 jvm配置参数说明
这些选项是特定于Java HotSpot虚拟机的通用选项.-X 显示所有可用-X选项的帮助. -Xbatch 禁用后台编译.默认情况下,JVM将该方法编译为后台任务,以解释器模式运行该方法,直到后台编 ...
- oracle的分析函数over(Partition by...) 及开窗函数
over(Partition by...) 一个超级牛皮的ORACLE特有函数. oracle的分析函数over 及开窗函数一:分析函数overOracle从8.1.6开始提供分析函数,分析函 ...
- rsyncd.conf
rsyncd.conf 28 Jan 2018 rsyncd.conf(5) 28 Jan 2018 NAME rsyncd.conf - configuration file for rsync i ...
- org.apache.hadoop.ipc.RemoteException: java.io.IOException:XXXXXXXXXXX could only be replicated to 0 nodes, instead of 1
原因:Configured Capacity也就是datanode 没用分配容量 [root@dev9106 bin]# ./hadoop dfsadmin -report Configured Ca ...
- myeclipse svn 插件去除已经保存的密码方法
myeclipse svn 插件去除已经保存的密码方法 删除掉C:\Documents and Settings\hao\Application Data\Subversion\auth\svn. ...
- 【DBCP】DBCP基本配置和重连配置+spring中配置
最近在看一些dbcp的相关内容,顺便做一下记录,免得自己给忘记了. 1. 引入dbcp (选择1.4) <dependency> <groupId>com.alibaba. ...
- tomcat中如何配置虚拟路径
第一步:打开server.xml配置文件.在Host节点里写上该行代码: <Context path="/upload" docBase="E:\upload&qu ...
- 2018.09.12 hdu2473Junk-Mail Filter(并查集)
传送门 一开始开题还以为是平衡树. 仔细想了一想并查集就可以了. 合并操作没什么好说的. 删除操作:对于每个点记录一个pos值表示原来的点i现在的下标是什么. 每次删除点i是就新建一个点cnt,然后令 ...