HDU 3360 National Treasures
题目大意:大厅每个位置都有一个文物或者一个守卫,文物是安全的前提是: 关键位置上必须有一个守卫,或者文物本身的位置上有一个守卫。求保证每个文物是安全的守卫的最少数量。
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int map[55][55];
int xid[5555];
int yid[5555];
struct node{int u,v;};
node edge[755555];
int first[75555],next[755555];
int vis[55555];
int cc,n,m,x_id,y_id;
int linker[55555];
int xx[12]={-1,-2,-2,-1,1,2,2,1,-1,0,1,0};
int yy[12]={-2,-1,1,2,2,1,-1,-2,0,1,0,-1};
inline void add_edge(int u,int v){
edge[cc].u=u;
edge[cc].v=v;
next[cc]=first[u];
first[u]=cc;
cc++;
}
bool dfs(int u){
int i;
for(i=first[u];i!=-1;i=next[i]){
int v=edge[i].v;
if(!vis[v]){
vis[v]=1;
if(linker[v]==-1||dfs(linker[v])){
linker[v]=u;
return true;
}
}
}
return false;
}
int match(int n){
int i;
int res=0;
memset(linker,-1,sizeof(linker));
for(i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
if(dfs(i))
res++;
}
return res;
}
void bfind(int mm){
int x=mm/m;
int y=mm%m;
int i;
if(map[x][y]==-1)return ;
for(i=0;i<12;i++){
if((1<<i)&map[x][y]){
int nx=x+xx[i];
int ny=y+yy[i];
if(nx>=n||nx<0||ny>=m||ny<0)
continue;
if(map[nx][ny]==-1)
continue;
if((x+y)%2==0)
add_edge(xid[mm],x_id-1+yid[nx*m+ny]);
else
add_edge(xid[nx*m+ny],x_id-1+yid[mm]);
}
}
}
int main(){
int cas=0;
while(scanf("%d%d",&n,&m)!=EOF){
if(n==0&&m==0)break; cas++;
int i,j; x_id=y_id=1,cc=0;
memset(xid,0,sizeof(xid));
memset(yid,0,sizeof(yid));
memset(first,-1,sizeof(first));
memset(next,-1,sizeof(next));
for(i=0;i<n;i++){
for(j=0;j<m;j++){
scanf("%d",&map[i][j]);
int x=i*m+j;
if((i+j)%2==0)xid[x]=x_id++;
else yid[x]=y_id++;
}
}
for(i=0;i<n;i++)for(j=0;j<m;j++)bfind(i*m+j);
int res=match(x_id-1);
printf("%d. %d\n",cas,res);
}
return 0;
}
HDU 3360 National Treasures的更多相关文章
- HDU 3360 National Treasures 奇偶匹配的最低点覆盖
标题来源:pid=3360">HDU 3360 National Treasures 意甲冠军:假设a[i][j] != -1 把他转成二进制 最多有12位 代表题目那张图的12个位置 ...
- HDU 3360 National Treasures(二分匹配,最小点覆盖)
National Treasures Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- HDU 3360 National Treasures(最小点覆盖)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3360 题目大意: 在一个n*m的格子中,每个格子有一个数值,-1表示空,其余表示财宝.每个财宝的数值转 ...
- HDU 3687 National Day Parade (暴力)
题意:给定 n 个人,在 n 列,问你移动最少的距离,使得他们形成一个n*n的矩阵. 析:这个题本来是要找中位数的,但是有特殊情况,所以改成暴力了,时间也很短,就是从第一个能够放左角的位置开始找,取最 ...
- hdu 3360 最小点覆盖 **
题意:给你一个图,图中有宝物和保安两种元素.每个宝物需要周围的某些位置同时安放保安(如果那些位置有宝物,可以把宝物替换成保安)问你最少需要再安置多少保安,可以使所有宝物满足要求. 题意有点难懂 链接: ...
- HDU题解索引
HDU 1000 A + B Problem I/O HDU 1001 Sum Problem 数学 HDU 1002 A + B Problem II 高精度加法 HDU 1003 Maxsu ...
- 【转载】图论 500题——主要为hdu/poj/zoj
转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...
- hdu图论题目分类
=============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...
- HDU图论题单
=============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...
随机推荐
- 对常量的引用(reference to const)的一般用途(转载)
如果是对一个常量进行引用,则编译器首先建立一个临时变量,然后将该常量的值置入临时变量中,对该引用的操作就是对该临时变量的操作.对C++常量引用可以用其它任何引用来初始化:但不能改变. 关于引用的初始化 ...
- window权限 及c++实现 【网摘】(转)
from : http://blog.csdn.net/zipper9527/article/details/6256459 http://www.lihuasoft.net/article/show ...
- MarkDown使用 (三)表格
MarkDown表格的用法 MarkDown表格的用法 例如: $$ \begin{array}{c|lcr} n & \text{Left} & \text{Center} & ...
- 星际反作弊2.3for-win7-xp-win8-win10
星际反作弊2.3for-win7-xp-win8-win10 下载地址 http://wj800.com/rar/scfzb.zip
- codevs 1183 泥泞的道路 01分数规划
题目链接 题目描述 Description CS有n个小区,并且任意小区之间都有两条单向道路(a到b,b到a)相连.因为最近下了很多暴雨,很多道路都被淹了,不同的道路泥泞程度不同.小A经过对近期天气和 ...
- GridView分页功能的实现
当GridView中显示的记录很多的时候,可以通过GridView的分页功能来分页显示这些记录.如果GridView是直接绑定数据库,则很简单:将"启动分页"打勾即可. 如果是用代 ...
- Linux 硬盘、网卡
根据硬盘接口的不同,在Liunx中会有不同的命名 IDE 接口的硬盘会被叫成: hda,hdb,hdc (hd -- hard disk) hda 表示第一块硬盘,hdb表示第二块硬盘! 一般来说我们 ...
- 经典灰鸽子lcx
方法1路由配置 在路由器配置 进入虚拟服务器 填入ip 端口 就可以了方法2内网域名解析想以前的花生客 科迈都有这项免费业务但现在基本不提供了如果那个网站还有内网解析的功能 大家一定要发上来哦方法3p ...
- Zepto Api参考
zepto API参考 简介 Zepto是一个轻量级的针对现代高级浏览器的JavaScript库, 它与jquery有着类似的api. 如果你会用jquery,那么你也会用zepto. 设计目的 ze ...
- C模块回调Lua函数的两种方法
作者:ani_di 版权所有,转载务必保留此链接 http://blog.csdn.net/ani_di C模块回调Lua函数的两种方法 lua和C通过虚拟栈这种交互方式简单而又可靠,缺点就是C做栈平 ...