思路:

棋盘是个二分图

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

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

最大独立集=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. SAP QM 权限控制可以到Inspection Type上
  2. OpenWrt-DreamBox 20120201下设置二级路由
  3. viewGroup 项目中使用
  4. 配置ORACLE 客户端连接到数据库
  5. c语言 遍历.jpg图像,求指导,如何用c语言实现读取*.raw格式图像
  6. 准备好做个硬核科技青年了么?| 【2019科技创新者大会】限时免费报名中
  7. sawmill全方位日志分析大师
  8. lua正则替换_lua 字符串 正则表达式 转义 特殊字符
  9. uva 232 Crossword Answers
  10. jsp页面引用相关js,css文件路径问题
  11. 东华大学python题库_2020尔雅纺纱学(东华大学)完整答案
  12. 安装ahci驱动sata
  13. Radis还年轻,代替MySQL还言之过早
  14. MySQL报错:ERROR 3546 (HY000): @@GLOBAL.GTID_PURGED cannot be changed: the new value must be a superset
  15. Unable to instantiate Action错误的解决
  16. 一入爬虫深似海,从此“节操”是路人!熬夜总结的python爬虫资料
  17. Nokia 6300使用技巧收集+总结
  18. 贝叶斯网络入门系列之一:资料篇
  19. unity笔记4 - 让方块翻滚前进(RotateAround)
  20. vxworks pci驱动

热门文章

  1. 目标检测-YOLO算法实现
  2. viper4android耳机爆音,利用ViPER4Android FX音效驱动提升耳机音质
  3. 软件工程学科思维导图
  4. 使用测试客户端「玩转」MQTT 5.0
  5. 基于C#+WinForm+SQL Server2016+Visual Studion2019的仓库管理系统
  6. python计算微积分_用Python学微积分---函数
  7. 计算机程序设计c++ 8-6:数组指针相关应用
  8. C语言if else语句
  9. 大数据各框架的原理与知识点
  10. DevComponents.DotNetBar之SuperTabControl动态调整TABS页的位置,以动态调整按钮ButtonItem