描述

在一个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. 初始Winsock编程

    1.套接字的创建和关闭 使用套接字之前,必须使用socket函数创建一个套接字,此函数调用成功将返回一个套接字句柄. 1 SOCKET socket( 2 int af, //用来指定套接字使用的地址 ...

  2. shell心得

    向loader.ctl中插入文本

  3. 2017-2018-1 20179202《Linux内核原理与分析》第七周作业

    一 .Linux内核创建一个新进程的过程 1. 知识准备 操作系统内核三大功能是进程管理,内存管理,文件系统,最核心的是进程管理 linux 进程的状态和操作系统原理的描述进程状态有所不同,比如就绪状 ...

  4. java实现两台电脑间TCP协议文件传输

    记录下之前所做的客户端向服务端发送文件的小项目,总结下学习到的一些方法与思路. 注:本文参考自<黑马程序员>视频. 首先明确需求,在同一局域网下的机器人A想给喜欢了很久的机器人B发送情书, ...

  5. CentOS7中热插拔硬盘如何读取新的硬盘

    在服务器或虚拟机上,一般会实现热插拔硬盘.此时CentOS7是无法读到新盘的,所以需要重新扫描. 我们添加一个新的硬盘演示: [root@xuexi ~]# ls /dev/sd* //应该还有一个s ...

  6. [leetcode tree]107. Binary Tree Level Order Traversal II

    Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left ...

  7. 1016 Phone Bills (25)(25 point(s))

    problem A long-distance telephone company charges its customers by the following rules: Making a lon ...

  8. 1008 Elevator (20)(20 point(s))

    problem The highest building in our city has only one elevator. A request list is made up with N pos ...

  9. Revit二次开发示例:AutoUpdate

    在Revit打开文件时,修改文件信息.并记录状态,存到log文件中. #region Namespaces using System; using System.Collections.Generic ...

  10. BZOJ.3489.A simple rmq problem(主席树 Heap)

    题目链接 当时没用markdown写,可能看起来比较难受...可以复制到别的地方看比如DevC++. \(Description\) 给定一个长为n的序列,多次询问[l,r]中最大的只出现一次的数.强 ...