思路:

棋盘是个二分图

那就把一个可以走的白点  向所有可以走的黑点连边

跑一个最大匹配   (匹配上了就代表这两个点不能共存)

最大独立集=sum-最大匹配

//By SiriusRen
#include <queue>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=222,M=N*N*21;
int n,m,a[N][N],color[N][N],id[N][N],S=0,jy,ans,sum;
int first[M],next[M],v[M],w[M],vis[M/16],tot,T,cnt;
char xx[]={1,-1,2,-2,1,-1,2,-2};
char yy[]={2,-2,1,-1,-2,2,-1,1};
void Add(int x,int y,int z){w[tot]=z,v[tot]=y,next[tot]=first[x],first[x]=tot++;}
void add(int x,int y,int z){Add(x,y,z),Add(y,x,0);}
bool tell(){memset(vis,-1,sizeof(vis));vis[S]=0;queue<int>q;q.push(S);while(!q.empty()){int t=q.front();q.pop();for(int i=first[t];~i;i=next[i])if(w[i]&&vis[v[i]]==-1)q.push(v[i]),vis[v[i]]=vis[t]+1;}return vis[T]!=-1;
}
int zeng(int x,int y){if(x==T)return y;int r=0;for(int i=first[x];y>r&&~i;i=next[i])if(w[i]&&vis[v[i]]==vis[x]+1){int t=zeng(v[i],min(y-r,w[i]));w[i]-=t,w[i^1]+=t,r+=t;}if(!r)vis[x]=-1;return r;
}
bool check(int x,int y){if(x<1||x>n||y<1||y>m||a[x][y])return false;return true;
}
int main(){memset(first,-1,sizeof(first));scanf("%d%d",&n,&m);T=n*m+1;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){id[i][j]=++cnt;scanf("%d",&a[i][j]);if((i+j)&1){color[i][j]=1,add(S,id[i][j],1);}else add(id[i][j],T,1);if(!a[i][j])sum++;}for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)if(color[i][j]&&!a[i][j])for(int k=0;k<8;k++){int tx=i+xx[k],ty=j+yy[k];if(check(tx,ty))add(id[i][j],id[tx][ty],1);}while(tell())while(jy=zeng(S,0x3f3f3f3f))ans+=jy;printf("%d\n",sum-ans);
}

转载于:https://www.cnblogs.com/SiriusRen/p/6654369.html

BZOJ 4808 二分图最大独立集相关推荐

  1. BZOJ 4808 二分图最大点独立集

    4808: 马 Description 众所周知,马后炮是中国象棋中很厉害的一招必杀技."马走日字".本来,如果在要去的方向有别的棋子挡住(俗 称"蹩马腿"), ...

  2. 最小割 ---- 二分图最大独立集(集合冲突模型) ---- 骑士共存 方格取数(网络流24题)

    二分图独立集 定理: 二分图最大独立集=n - 二分图最大匹配 其实二分图独立集是特殊的一种最大权闭合子图.我们根据上文"收益"的思想,把选某个点的收益看为1,左部节点为正权点,右 ...

  3. 洛谷 - P3355 骑士共存问题(二分图最大独立集)

    题目链接:点击查看 题目大意:给出一个n*n的棋盘,上面有m个点无法放置棋子,现在要求尽可能多的放 马,使得所有的马两两无法互相攻击,题目要求输出可以放置的最大数量 题目分析:二分图最大独立集的裸题, ...

  4. CH - 6901 骑士放置(二分图最大独立集-二分图最大匹配+奇偶拆点)

    题目链接:点击查看 题目大意:给出一个n*m的棋盘,有t个点是禁止放棋子的,现在按照马走日的规则,问在互不影响的情况下最多能放多少个马 题目分析:这里首先简单介绍一下二分图最大独立集的定义: 通俗来讲 ...

  5. [二分图最大独立集] BZOJ4808:马

    棋盘01染色,然后把互相能打到的点连边,发现是个二分图. 二分图最大独立集 == 点数 −- 最大匹配数 Dinic练手- #include<cstdio> #include<que ...

  6. BZOJ 4808(马-二分图最大独立集)

    4808: 马 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 111 Solved: 46 [Submit][Status][Discuss] Des ...

  7. BZOJ 4808: 马(二分图最大点独立集)

    http://www.lydsy.com/JudgeOnline/problem.php?id=4808 题意: 思路: 这图中的两个马只能选一个,二选一,很像二分图吧,对能互吃的两个棋子连线,在所选 ...

  8. 二分图HK算法[数论+二分图最大独立集]:Lightoj1356

    Prime Independence LightOJ - 1356 题目大意:给你n个数,你从这个集合中挑选出若干个数,使得这个集合的数里面两两之间a/b!=k[k是质数并且a>b]a/b!=k ...

  9. poj3692(二分图最大独立集)

    题目大概意思为有G个女生和B个男生,每个男生都相互认识,每个女生也相互认识,部分男生与部分女生相互认识,求最大相互认识的点集 题目很简单,只用稍微转换一下思路即可,因为我们要以男生与女生来构建二分图, ...

最新文章

  1. python中@修饰符用法
  2. Eclipse 动态库调试(联合调试)
  3. 北航计算机应用基础 统考,北航10秋学期《计算机应用基础》模拟题.doc
  4. ping github超时问题
  5. 【Linux】crontab命令详解
  6. 使用literal语法格式化字符串
  7. Mdebug:基于React开发的移动web调试工具
  8. 跟各位读者朋友分享下公众号运营策略
  9. Ubuntu 16.04/CentOS 6.9安装Apache压力(并发)测试工具ab
  10. .NET中栈和堆的比较1
  11. PersonGraphDataSet近十万的开放人物关系图谱项目
  12. springboot整合fastdfs
  13. VB讲课笔记06:窗体与常用控件
  14. 百度昆仑AI芯片已完成研发:明年初量产 由三星代工
  15. apache mod_autoindex 详解
  16. matlab 正态分布相关 API
  17. Docker-compose部署gitlab中文版
  18. 【51nod】1776 路径计数
  19. tomcat 官网下载
  20. 关于对象中的this指向和修改this指向问题。

热门文章

  1. Hadoop面试题和答案
  2. 计算机一级wps office选择题技巧,计算机一级WPSoffice考前练习题和答案
  3. Stream通过List里对象中某个属性最小来取该最小对象
  4. ip地址转换数字函数 iton_数字转IP地址函数
  5. 硬盘数据迁移软件哪款好用?强烈推荐它!
  6. andriod R wifi 开启流程
  7. fis2 入门--fis3使用
  8. SQL yyyyMMdd转yyyy-MM-dd
  9. [STM32F1]基于STM32F103实现TM1640点亮16位共阴极数码管,显示“0~F”数字
  10. 对于代码复现学习的一些理解||计算机研究生学习笔记||经验分享||深度学习||pytorch||不定期长期更新