描述

在一个N*N的正方形棋盘上,放置了一些骑士。我们将棋盘的行用1开始的N个自然数标记,将列用'A'开始的N个大写英文字母标记。举个例子来说,一个标准的8*8的国际象棋棋盘的行标记为1..8,列标记为A..H,D3、H1分别表示棋盘上第3行第4列和第1行第8列的格子。

骑士是这样一类棋子。若一个骑士放置在格子(x, y)。那么格子(x-2, y-1), (x-2, y+1), (x-1, y-2), (x-1, y+2), (x+1, y-2), (x+1, y+2), (x+2, y-1), (x+2, y+1)如果在棋盘内的话,就都处于这个骑士的攻击范围内。

如果若干个骑士在棋盘上的一种放置方法能使得没有一个骑士处在其它骑士的攻击范围内,那么称为和谐的方案。现在给定一个棋盘,上面已经放置了M个骑士。你的任务是拿走尽可能少的骑士,使得剩余的骑士构成一个和谐的方案。

格式

输入格式

第一行,两个正整数N,M,分别表示棋盘的大小,和骑士的数目。

以下M行,每行一个字符串,描述一个骑士的坐标。

输出格式

输出一行,一个整数,表示至少拿走多少个骑士。

样例1

样例输入1[复制]

 
6 9
A1
A5
B3
C5
C1
D2
D4
E6
F5

样例输出1[复制]

 
3

限制

每个测试点1s

提示

30%的数据满足,1 <= N <= 4.
100%的数据满足,1 <= N <= 26,骑士的坐标格式均合法,任意两个骑士的位置都不同。

来源

Topcoder

————————————我是分割线————————————————————
二分图问题。
看到这道题我们先会想到贪心,就是那个骑士被踩的最多,就先拿哪个。
但是,提交后就只过了5个点,  其实这种贪心策略是不对的
特殊情况
当图G是以最大度数为偶数的点对称的奇阶图时,这种策略就是不对的....
那么要怎么做呢..
我们可以将各个骑士看成点,然后将互相攻击的骑士连边,那么求拿走多少也就是求这个图最小点的覆盖
求一般图的最小点的覆盖时无法在多项式时间里解决的.....
那要怎么办呢  
我们知道二分图的最大匹配就是最小点的覆盖,那我们看看这个图是不是二分图。
这个图就是二分图
证明:
将棋盘黑白二染色,即将A1染成黑色,然后与A1相邻的格子染成白色,然后与白色格子相邻的再染成黑色,依次类推。那么可以发现,两个发生冲突的骑士所在的格子一定是一黑一白。那么,将白色格子的骑士对应的点设为无向图的X部,黑色对应到Y部,那么边就只存在于两部分的点之间。得证。
所以将x部的点向y部的点连边,得到一张二分图,那么求这个二分图的最大匹配就是结果。
 /*
Problem:
OJ:
User:S.B.S.
Time:
Memory:
Length:
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstdlib>
#include<iomanip>
#include<cassert>
#include<climits>
#include<functional>
#include<bitset>
#include<vector>
#include<list>
#include<map>
#define maxn 100001
#define F(i,j,k) for(int i=j;i<=k;i++)
#define M(a,b) memset(a,b,sizeof(a))
#define FF(i,j,k) for(int i=j;i>=k;i--)
#define inf 0x3f3f3f3f
#define maxm 1001
#define mod 998244353
//#define LOCAL
using namespace std;
int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
const int dx[]={-,-,-,-,,,,};
const int dy[]={-,-,,,,,-,-};
int n,m;
struct EDGE
{
int from;
int to;
int next;
}e[maxn];
struct NODE
{
int x;
int y;
}a[maxn];
int head[maxn];
int tot;
int vis[maxm][maxm],ins[maxn];
int py[maxn];
int ans;
inline void addedge(int u,int v)
{
tot++;
e[tot].from=u;
e[tot].to=v;
e[tot].next=head[u];
head[u]=tot;
}
inline bool path(int x)
{
int y;
for(int i=head[x];i;i=e[i].next)
{
if(!ins[y=e[i].to]){
ins[y]=;
if(!py[y]||path(py[y])){
py[y]=x;
return true;
}
}
}
return false;
}
int main()
{
// std::ios::sync_with_stdio(false);//cout<<setiosflags(ios::fixed)<<setprecision(1)<<y;
#ifdef LOCAL
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
#endif
cin>>n>>m;
char s[];
F(i,,m){
gets(s+);
a[i].x=s[]-'A'+;
int len=strlen(s+);
F(j,,len){
a[i].y*=;
a[i].y+=s[j]-'';
}
vis[a[i].x][a[i].y]=i;
}
F(i,,m){
F(k,,){
int fx=dx[k]+a[i].x,fy=dy[k]+a[i].y;
if(fx<||fy<||fx>n||fy>n||!vis[fx][fy]) continue;
addedge(i,vis[fx][fy]);
}
}
F(i,,m){
if((a[i].x+a[i].y)&){
M(ins,);
if(path(i)) ans++;
}
}
cout<<ans<<endl;
return ;
}

vijos p1729 Knights的更多相关文章

  1. 【vijos】1729 Knights(匈牙利)

    https://vijos.org/p/1729 这题好奇葩,为嘛N开到30就会re啊..........n<=26吗.... sad 因为根据棋子的分布,能攻击的一定各在一黑白格上,所以直接二 ...

  2. 【BZOJ 1061】【Vijos 1825】【NOI 2008】志愿者招募

    http://www.lydsy.com/JudgeOnline/problem.php?id=1061 https://vijos.org/p/1825 直接上姜爷论文... #include< ...

  3. POJ2942 Knights of the Round Table[点双连通分量|二分图染色|补图]

    Knights of the Round Table Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 12439   Acce ...

  4. vijos P1915 解方程 加强版

    背景 B酱为NOIP 2014出了一道有趣的题目, 可是在NOIP现场, B酱发现数据规模给错了, 他很伤心, 哭得很可怜..... 为了安慰可怜的B酱, vijos刻意挂出来了真实的题目! 描述 已 ...

  5. vijos P1780 【NOIP2012】 开车旅行

    描述 小\(A\)和小\(B\)决定利用假期外出旅行,他们将想去的城市从\(1\)到\(N\)编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市\(i\)的海拔高度为 ...

  6. 【BZOJ 2541】【Vijos 1366】【CTSC 2000】冰原探险

    http://www.lydsy.com/JudgeOnline/problem.php?id=2541 https://vijos.org/p/1366 loli秘制大爆搜_(:з」∠)_坑了好久啊 ...

  7. 【BZOJ 1065】【Vijos 1826】【NOI 2008】奥运物流

    http://www.lydsy.com/JudgeOnline/problem.php?id=1065 https://vijos.org/p/1826 好难的题啊TWT ∈我这辈子也想不出来系列~ ...

  8. POJ 2942 Knights of the Round Table

    Knights of the Round Table Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 10911   Acce ...

  9. LightOJ1171 Knights in Chessboard (II)(二分图最大点独立集)

    题目 Source http://www.lightoj.com/volume_showproblem.php?problem=1171 Description Given an m x n ches ...

随机推荐

  1. 【LOJ】#2123. 「HEOI2015」最短不公共子串

    题解 我们对于B串建出后缀自动机和序列自动机 对于问题1,枚举左端点然后跑后缀自动机,直到不能匹配作为这个左端点的答案 对于问题2,枚举左端点然后跑序列自动机,直到不能匹配 对于问题3,设f[i][j ...

  2. 插头DP学习笔记——从入门到……????

    我们今天来学习插头DP??? BZOJ 2595:[Wc2008]游览计划 Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该 ...

  3. USACO 6.3 Cryptcowgraphy

    CryptcowgraphyBrian Dean The cows of Farmer Brown and Farmer John are planning a coordinated escape ...

  4. Xiaoguang Tu's Home Page

    Xiaoguang Tu (涂晓光): CV: Ph.D. Candidate of School of Communication and Information Engineering, Univ ...

  5. js缓存加密

    1.访问A链接就以A链接的特定部分为密码盐,生成一个js跳转配置文件名 aojoweiojoiwjeiof2.PHP在生成js跳转文件名的时候,也是根据数据库中的跳转起始链接特定部分作为盐,生成的文件 ...

  6. NCPC 2016 October 8,2016 Artwork

    Problem A Artwork Problem ID: artwork Time limit: 4 seconds A template for an artwork is a white gri ...

  7. String 的常用操作

    String 类,我可以不负责的说在 Java 中这个类应该是使用最频繁的类了.然而关于它的常用的操作,我却不甚了解.整理这个东西很反人性的,这些方法,你看到他的时候感觉很简单,但是真正用的时候还是不 ...

  8. Java反射机制demo(三)—获取类中的构造函数

    Java反射机制demo(三)—获取类中的构造函数 1,获取类中所有的构造函数 如下面的代码中所示,这个类中显式的构造函数有五个. 空构造: public UserInfo() 带参构造有四个: pu ...

  9. Linux驱动之内存访问

    <背景> 内存会以分页方式组织内存,而且每页大小和计算机体系结构有关系,Linux中每个页都有对应的struct page{} 与之对应.                         ...

  10. 【BZOJ 3640】JC的小苹果 (高斯消元,概率DP)

    JC的小苹果 Submit: 432  Solved: 159 Description 让我们继续JC和DZY的故事. “你是我的小丫小苹果,怎么爱你都不嫌多!” “点亮我生命的火,火火火火火!” 话 ...