【二分图最大独立集】BZOJ4808[马]题解
来源:互联网 发布:哪个校音器软件好用 编辑:程序博客网 时间:2024/06/06 05:07
题目概述
给出
解题报告
NOIP2017前的最后一题QAQ。
首先将棋盘
由于要放最多的马,其实就是最大独立集。
最大独立集
示例程序
#include<cstdio>using namespace std;const int maxn=200,maxm=200,maxt=20000;const int fl[8][2]={{-2,-1},{-2,1},{-1,-2},{-1,2},{1,-2},{1,2},{2,-1},{2,1}};int n,m,tot[2],ID[2][maxn+5][maxm+5];int E,lnk[maxt+5],nxt[maxt*8+5],son[maxt*8+5],who[maxt+5];int ti,vis[maxt+5],ans;#define check(x,y) (1<=(x)&&(x)<=n&&1<=(y)&&(y)<=m&&ID[0][x][y])#define Add(x,y) son[++E]=(y),nxt[E]=lnk[x],lnk[x]=Einline bool Find(int x){ if (vis[x]==ti) return false;vis[x]=ti; for (int j=lnk[x];j;j=nxt[j]) if (!who[son[j]]||Find(who[son[j]])) return who[son[j]]=x,true; return false;}int main(){ freopen("program.in","r",stdin); freopen("program.out","w",stdout); scanf("%d%d",&n,&m); for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) { int x;scanf("%d",&x);if (x) continue; ID[i+j&1][i][j]=++tot[i+j&1]; } for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) if (i+j&1) for (int f=0;f<8;f++) if (check(i+fl[f][0],j+fl[f][1])) Add(ID[1][i][j],ID[0][i+fl[f][0]][j+fl[f][1]]); for (int i=1;i<=tot[1];i++) ti++,ans+=Find(i); return printf("%d\n",tot[0]+tot[1]-ans),0;}
阅读全文
0 0
- 【二分图最大独立集】BZOJ4808[马]题解
- [二分图最大独立集] BZOJ4808:马
- 【bzoj4808】【马】二分图最大点独立集+简单感性证明
- 二分图最大独立集
- 二分图最大独立集
- 二分图最大独立集
- 二分图最大匹配 & 最大独立集
- BZOJ 4808(马-二分图最大独立集)
- BZOJ 4808: 马【二分图】【最大独立集】
- hdu 3829 二分图最大独立集
- poj 2771 二分图最大独立集
- HDU2768二分图求最大独立集
- poj3692 Kindergarten 二分图最大独立集
- hdu4160 Dolls (二分图最大独立集)
- poj 1466 二分图 最大独立集
- 二分图最大独立集--poj2771
- 二分图最大独立集-poj1466
- poj1466 二分图最大独立集
- 简图记录-linux进程的管理与调度
- Cocos2d-x 屏幕适配新解
- 7-4 表达式转换(25 point(s))(栈的应用)
- 对拍与一键编译
- 最大流模板
- 【二分图最大独立集】BZOJ4808[马]题解
- PHP文件操作---文件file
- 瀑布流
- 计算机操作系统 虚拟内存
- 7-5 银行业务队列简单模拟(25 point(s))
- 你可能不知道的javascript调试技巧
- 网址
- Java for Web学习笔记(八七):消息和集群(2)应用内的publish和subscribe
- MySQL