[二分图]PKU 2446 ChessBoard

来源:互联网 发布:抗韩中年人淘宝外设店 编辑:程序博客网 时间:2024/06/05 11:53

题目描述
因为题面英文,本人简略翻译
一个m*n的棋盘里有k个格子被去除了,你要用2*1的长方形纸条把棋盘填满。
若能做到,则输出YES,否则输出NO

输入格式
第一行有m,n,k三个正整数
m代表行,n代表列,k代表被去除的格子数
接下来k行每行有两个数x,y代表被去除的格子的坐标

m,n<=32 k<=m*n

输出格式
仅一行,YES或NO

分析
这题啊,我用格子的奇偶性质连边做了很久,最后找不到错误。。
结果最后发现原来,,,,m代表的是行。。。n代表的是列。。
结果一道水题千古难题就被破解了[滑稽]
算法还是那个老套匈牙利
连边还是奇偶连边(应该是吧?)或者区块连边
反正对了就是了[滑稽]

#include <iostream>#include <cstdio>#include <memory.h>using namespace std;int n,m,k,x,y;int f[1601],l[41][41];bool r[1601],q[41][41],map[1601][1601],ans;int i,j;bool fin(int a){    int i,d;    for (i=1;i<=x;i++)    if (!r[i]&&map[a][i])    {        d=f[i];f[i]=a;r[i]=1;        if (d==0||fin(d)) return true;        f[i]=d;    }    return false;}int main(){    scanf("%d%d%d",&m,&n,&k);    for (i=1;i<=k;i++)    {        scanf("%d%d",&x,&y);        q[x][y]=1;    }    x=0;    for (i=1;i<=n;i++)    for (j=1;j<=m;j++)    if (!q[i][j])    {        x++;        l[i][j]=x;    }    for (i=1;i<=n;i++)    for (j=1;j<=m;j++)    if (!q[i][j])    {        y=l[i][j];        if (i-1>0&&!q[i-1][j]) map[y][l[i-1][j]]=1;        if (i+1<=n&&!q[i+1][j]) map[y][l[i+1][j]]=1;        if (j-1>0&&!q[i][j-1]) map[y][l[i][j-1]]=1;        if (j+1<=m&&!q[i][j+1]) map[y][l[i][j+1]]=1;    }    ans=true;    for (i=1;i<=x;i++)    {        memset(r,0,sizeof(r));        if (!fin(i))         {            ans=false;            break;        }    }    if (ans) printf("YES");    else printf("NO");}
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 空调加多少氟合适 加氟多少钱 空调加一次氟利昂多少钱 加氟利昂 空调氟利昂 空调氟利昂多久加一次 冰箱加氟利昂多少钱 氟利昂怎么加 空调氟 空调怎么放氟 氟利昂怎么加进空调 清理空调多少钱 二匹空调多少瓦 空调清理多少钱 维修空调多少钱 空调清洗费用 一般空调多少瓦 变频空调比定频空调省多少电 空调外机怎么安装 空调雪种 空调外机安装图片 汽车空调多久加一次氟 空调多长时间加一次氟 磷酸二氢钾加芸苔素 加氢 白带过氧化氢一个加号 加氢站 加氢反应釜 2019一加手机怎么切换氢桌面 渣油加氢 加氢催化剂 加氢反应器 煤焦油加氢装置 汽油加氢 煤焦油加氢工艺技术 一加桌面和氢桌面 氢氧化钠加二氧化碳 钯碳加氢催化剂 白带检查过氧化氢一个加 加沙