题目背景

众周所知,在西洋棋中,我们有城堡、骑士、皇后、主教和长脖子鹿。

题目描述

如图所示,西洋棋的“长脖子鹿”,类似于中国象棋的马,但按照“目”字攻击,且没有中国象棋“别马腿”的规则。(因为长脖子鹿没有马腿)

给定一个N * M,的棋盘,有一些格子禁止放棋子。问棋盘上最多能放多少个不能互相攻击的长脖子鹿。

输入输出格式

输入格式:

输入的第一行为两个正整数N,M,K。其中K表示禁止放置长脖子鹿的格子数。

第22~第K+1行每一行为两个整数 Xi, Yi表示禁止放置的格子。

输出格式:

一行一个正整数,表示最多能放置的长脖子鹿个数。

代码

二分图的最大独立集,我们考虑如何进行黑白染色

如果我们按点来进行二分图建立的话,那么发现黑点都连黑点,白点都连白点。所以这样做一定是错的。

那么我们按行来进行黑白染色的话,这样就好了。

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=300+5,maxm=800000+100;
int head[maxn*maxn],dis[maxn*maxn];
int cur[maxn*maxn];
bool mark[maxn][maxn];
int n,m,k;
int s,t;
struct egde
{
int to,next,cap;
}e[maxm];
int size=1;
int dx[]={1,1,-1,-1,3,3,-3,-3},dy[]={3,-3,3,-3,1,-1,1,-1};
void addedge(int u,int v,int val)
{
e[++size].to=v;e[size].cap=val;e[size].next=head[u];head[u]=size;
e[++size].to=u;e[size].cap=0;e[size].next=head[v];head[v]=size;
}
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch<='9'&&ch>='0'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
bool bfs()
{
memset(dis,0,sizeof(dis));
deque<int>q;
q.push_back(s);
dis[s]=1;
while(!q.empty())
{
int u=q.front();
q.pop_front();
for(int i=head[u];i;i=e[i].next)
{
int to=e[i].to;
if(!dis[to]&&e[i].cap>0)
{
dis[to]=dis[u]+1;
if(q.empty()||dis[to]>dis[q.front()])q.push_back(to);
else q.push_front(to);
}
}
}
return dis[t];
}
int dinic(int u,int f)
{
if(u==t)return f;
for(int &i=cur[u];i;i=e[i].next)
{
int to=e[i].to;
if(dis[to]==dis[u]+1&&e[i].cap>0)
{
int d=dinic(to,min(f,e[i].cap));
if(d>0)
{
e[i].cap-=d;
e[i^1].cap+=d;
return d;
}
}
}
return 0;
}
int maxflow()
{
int flow=0;
while(bfs())
{
memcpy(cur,head,sizeof(head));
while(1)
{
int f=dinic(s,inf);
if(f==0)break;
flow+=f;
}
}
return flow;
}
int id(int i,int j)
{
return (i-1)*m+j;
}
int main()
{
n=read(),m=read(),k=read();
s=0,t=n*m+1;
for(int i=1;i<=k;i++)
mark[read()][read()]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(mark[i][j])continue;
int u=id(i,j);
if(i&1)
{
addedge(s,u,1);
for(int l=0;l<8;l++)
{
int x=i+dx[l],y=j+dy[l]; if(mark[x][y])continue;
if(x<1||x>n||y<1||y>m)continue;
int v=id(x,y);
addedge(u,v,1);
}
}
else addedge(u,t,1);
} printf("%d",n*m-k-maxflow());
return 0;
}

P5030 长脖子鹿放置的更多相关文章

  1. P5030 长脖子鹿放置 最小割

    $ \color{#0066ff}{ 题目描述 }$ 如图所示,西洋棋的"长脖子鹿",类似于中国象棋的马,但按照"目"字攻击,且没有中国象棋"别马腿& ...

  2. 洛谷 - P5030 - 长脖子鹿放置 - 二分图最大独立集

    https://www.luogu.org/problemnew/show/P5030 写的第一道黑色题,图建对了. 隐约觉得互相攻击要连边,规定从奇数行流向偶数行. 二分图最大独立集=二分图顶点总数 ...

  3. Luogu P5030 长脖子鹿放置(网络流)

    匈牙利T了,Dinic飞了... 按奇偶连 #include <cstdio> #include <iostream> #include <cstring> #in ...

  4. 长脖子鹿放置【洛谷P5030】二分图最大独立集变形题

    题目背景 众周所知,在西洋棋中,我们有城堡.骑士.皇后.主教和长脖子鹿. 题目描述 如图所示,西洋棋的“长脖子鹿”,类似于中国象棋的马,但按照“目”字攻击,且没有中国象棋“别马腿”的规则.(因为长脖子 ...

  5. 洛谷[LnOI2019]长脖子鹿省选模拟赛 简要题解

    传送门 听说比赛的时候T4T4T4标程锅了??? WTF换我时间我要写T3啊 于是在T4T4T4调半天无果的情况下260pts260pts260pts收场真的是tcltcltcl. T1 快速多项式变 ...

  6. 【洛谷比赛】[LnOI2019]长脖子鹿省选模拟赛 T1 题解

    今天是[LnOI2019]长脖子鹿省选模拟赛的时间,小编表示考的不怎么样,改了半天也只会改第一题,那也先呈上题解吧. T1:P5248 [LnOI2019SP]快速多项式变换(FPT) 一看这题就很手 ...

  7. [luogu#2019/03/10模拟赛][LnOI2019]长脖子鹿省选模拟赛赛后总结

    t1-快速多项式变换(FPT) 题解 看到这个\(f(x)=a_0+a_1x+a_2x^2+a_3x^3+ \cdots + a_nx^n\)式子,我们会想到我们学习进制转换中学到的,那么我们就只需要 ...

  8. 洛谷[LnOI2019]长脖子鹿省选模拟赛t1 -> 快速多项式变换

    快速多项式 做法:刚拿到此题有点蒙,一开始真没想出来怎么做,于是试着去自己写几个例子. 自己枚举几种情况之后就基本看出来了,其实本题中 n 就是f(m)在m进制下的位数,每项的系数就是f(m)在m进制 ...

  9. [LnOI2019]长脖子鹿省选模拟赛 东京夏日相会

    这里来一发需要开毒瘤优化,并且几率很小一遍过的模拟退火题解... 友情提醒:如果你很久很久没有过某一个点,您可以加上特判 可以像 P1337 [JSOI2004]平衡点 / 吊打XXX 那道题目一样 ...

随机推荐

  1. 使用python3搭建Linux-mariadb主从架构

    环境准备两台: 192.168.193.90 master 192.168.193.91 slave 需要Linux装python环境: https://www.cnblogs.com/kingzhe ...

  2. wireshare文件格式

    你用Wireshark打开这个pkt试试,如果可以打开,就说明Wireshark支持这种格式.然后你就可以去看Wireshark的源码.*.pkt是omnipeek/etherpeek的默认文件格式, ...

  3. c# 匿名委托

    using System; namespace AnonymousMethod { delegate void ArithmeticOperation(double operand1, double ...

  4. python3-返回函数

    函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回. 我们来实现一个可变参数的求和.通常情况下,求和的函数是这样定义的: def calc_sum(*args): ax = ...

  5. 《Webkit技术内幕》之页面渲染过程

    文章同步到github<Webkit技术内幕>之页面渲染过程 最近拜读了传说中的<Webkit技术内幕>一书,有很大收获,尤其是对页面渲染有了较深的认识.由于功力有限,而且书中 ...

  6. map接口、hashmap常用方法

    注意:map中键不能重复(是否重复是根据equals方法判断),否则新的会覆盖为旧的 范例: public class TestMap { public static void main(String ...

  7. python的list拷贝

    有三种情况 第一种:赋值(不是拷贝) a=[1,2,3] b=a 这种不是拷贝,a和b是一个变量,内存是一个 第二种:浅拷贝 a=[1,2,3,[4,5,6]] b=a b的第一层是独立的,第二层会更 ...

  8. Anacond的介绍

    Anacond的介绍 Anaconda指的是一个开源的Python发行版本,其包含了conda.Python等180多个科学包及其依赖项. 因为包含了大量的科学包,Anaconda 的下载文件比较大( ...

  9. iText导出PDF(图片,水印,页眉,页脚)

    项目需要导出PDF,导出的内容包含图片和文本,而且图片的数量不确定,在网上百度发现大家都在用iText,在官网发现可以把html转换为PDF,但是需要收费,那就只能自己写了. 在开始之前先在网上百度了 ...

  10. php中substr_compare()区分大小写吗

    PHP substr_compare() 函数 定义和用法 substr_compare() 函数从指定的开始位置比较两个字符串. 提示:该函数是二进制安全且选择性地对大小写敏感(区分大小写). 语法 ...