题意:
      给你一个n*m的格子,有的格子上有坑,然后让你用1*2的东西去覆盖所有没有坑的格子,不能重叠,坑上也不能放东西覆盖,问是否能成功。

思路: 
      简单题目,每个格子和四周的格子如果可以放在同一个1*2的里面那么就连接一条边,直接匹配一遍就行了,有的人可能想问为什么?可以这么想,首先如果像覆盖所有的格子那么必须是放最多的1*2覆盖物((n*m-k)/2这么多个),然后每个覆盖物会覆盖两个,也就是说必须这写覆盖物最后覆盖的都是一对一对的,把所有的点都拆成两个点,左右各一排,然后直接匹配,最后/2是不是就是能覆盖的最大的对数?so.....

#include<stdio.h>
#include<string.h>

#define N_node 1500
#define N_edge 6000

typedef struct
{
    int to ,next;
}STAR;

STAR E[N_edge];
int list[N_node] ,tot;
int mkgx[N_node] ,mkdfs[N_node];
int map[32+5][32+5];

void add(int a ,int b)
{
    E[++tot].to = b;
    E[tot].next = list[a];
    list[a] = tot;
}

int DFS_XYL(int x)
{
    for(int k = list[x] ;k ;k = E[k].next)
    {
        int to = E[k].to;
        if(mkdfs[to]) continue;
        mkdfs[to] = 1;
        if(mkgx[to] == -1 || DFS_XYL(mkgx[to]))
        {
            mkgx[to] = x;
            return 1;
        }
    }
    return 0;
}

int main ()
{
    int n ,m ,q;
    int a ,b ,i ,j;
    while(~scanf("%d %d %d" ,&n ,&m ,&q))
    {
        memset(map ,0 ,sizeof(map));
        for(i = 1 ;i <= q ;i ++)
        {
            scanf("%d %d" ,&a ,&b);
            map[b][a] = 1;
        }
        
        if((n * m - q)&1)
        {
            printf("NO\n");
            continue;
        }
        memset(list ,0 ,sizeof(list));
        tot = 1;
        for(i = 1 ;i <= n ;i ++)
        for(j = 1 ;j <= m ;j ++)
        {
            if(map[i][j]) continue;
            if(i <= n - 1 && !map[i+1][j])
            add((i - 1) * m + j ,i * m + j);
            if(j <= m - 1 && !map[i][j+1])
            add((i - 1) * m + j ,(i - 1) * m + j + 1);
            if(i >= 2 && !map[i-1][j])
            add((i - 1) * m + j ,(i - 2) * m + j);
            if(j >= 2 && !map[i][j-1])
            add((i - 1) * m + j ,(i - 1) * m + j - 1);
        }
        memset(mkgx ,255 ,sizeof(mkgx));
        int ans = 0;
        for(i = 1 ;i <= n * m ;i ++)
        {
            memset(mkdfs ,0 ,sizeof(mkdfs));
            ans += DFS_XYL(i);
        }
        if(ans == n * m - q)
        printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}

POJ2446 模板盖格子 简单二分匹配相关推荐

  1. POJ2239简单二分匹配

    题意:       一周有7天,每天可以上12节课,现在给你每科课的上课时间,问你一周最多可以上几科课,一科课只要上一节就行了. 思路:       简单题目,直接二分就行了,好久没写二分匹配了,练习 ...

  2. hdu 1054 Strategic Game 最小点覆盖 = 最大二分匹配

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1054 简单二分匹配,根据题意构造一个无向图.然后求最小点覆盖,然后扫描mark数组将曾经匹配的点所匹配 ...

  3. 石油采集(求联通区域) 2018多校寒假集训 (dfs+二分匹配)

    题目: 链接:https://www.nowcoder.com/acm/contest/76/A 来源:牛客网 随着海上运输石油泄漏的问题,一个新的有利可图的行业正在诞生,那就是撇油行业.如今,在墨西 ...

  4. hdu 1281棋盘游戏(二分匹配)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1281 Problem Description 小希和Gardon在玩一个游戏:对一个N*M的棋盘,在格 ...

  5. POJ - 2446 Chessboard 二分匹配+建图

    题目链接 题意很简单,是二分匹配的一种常见的题型,问题就在于怎样转换到二分图上来. 首先对对n*m-k正常点进行编号,然后遍历查找每一个正常点的上下左右是否能连接(就是判断另个点是否也是正常的),如果 ...

  6. 香港大学提出OneNet:一阶段端到端目标检测网络,无需NMS!无需二分匹配!

    点击上方,选择星标或置顶,不定期资源大放送! 阅读大概需要15分钟 Follow小博主,每天更新前沿干货 本文作者:孙培泽 |  编辑:Amusi https://zhuanlan.zhihu.com ...

  7. pku 1486 求出二分匹配图中的必须边

    开始楞是没看懂意思,E文让我很纠结... 要判断一条边是否为二分图中必须边,方法如下: 1.先求出原图的任意最大匹配 2.对二分图某一边的所有点,删去其当前的匹配边.删的过程不是简单的将原图设为不连通 ...

  8. POJ1325二分匹配或者DINIC(最小路径覆盖)

    题意:        有k个任务,两个机器,第一个机器有n个模式,第二个机器有m个模式,每个任务要么在第一个机器的一个模式下工作,要么在第二个机器的一个模式下工作,机器每切换一个模式需要重启一次,两个 ...

  9. hdu 5093 二分匹配

    /* 题意:给你一些冰岛.公共海域和浮冰,冰岛可以隔开两个公共海域,浮冰无影响 求选尽可能多的选一些公共海域点每行每列仅能选一个. 限制条件:冰山可以隔开这个限制条件.即*#*可以选两个 预处理: * ...

最新文章

  1. 【面试】我是如何面试别人List相关知识的,深度有点长文
  2. C语言程序设计第十章字符串,C语言程序设计(字符串)
  3. Java核心技术卷1——笔记(1)
  4. Python自动化开发学习15-css补充内容
  5. 导向滤波python_导向滤波(Guided Filter)简要介绍
  6. 转:如何进行软件架构设计?
  7. 全球及中国高强度钢行业发展态势与市场规模分析报告2022版
  8. 树莓派命令连接wifi_树莓派连接无线网wifi配置方法
  9. 合泰单片机做电压表_启士 | 蓝桥杯零基础单片机教程9 I2C介绍(上)
  10. C/C++语言函数学习(2)qsort
  11. # android开发:4-1、Activity启动方式、生命周期、不同activity的数据传递
  12. weak引用表原理探究
  13. java 如何执行dig 命令_linux dig 命令使用方法
  14. 打喷嚏的龙(dargon)
  15. 深圳中学高考2021成绩查询,2020深圳高中高考数据对比,明年考多少分能上好高中?...
  16. python感叹号的作用_Python的作用
  17. 算法:URL短地址压缩算法-短网址映射。
  18. Hadoop -- hadoop介绍
  19. SVPWM控制技术+Matlab/Simulink仿真详解
  20. 从u盘到计算机内存的过程,U盘装系统步骤图解(超详细)

热门文章

  1. 曙光与包头签署云计算中心战略合作协议
  2. 关于PostgreSQL的GiST索引之四
  3. Javascript刷新全集
  4. [WF4.0]工作流设计器Rehosting(一)
  5. Apache下PHP的几种工作方式
  6. ArcGIS For JavaScript API 默认参数
  7. 总结sqlserver数据库性能优化相关的注意事项
  8. hibernate一级缓存和二级缓存的区别[转]
  9. Visual C# 2010 实现资源管理器
  10. 操作系统:Android(Google公司开发的操作系统)