BZOJ 4808: 马(二分图最大点独立集)
http://www.lydsy.com/JudgeOnline/problem.php?id=4808
题意:
思路:
这图中的两个马只能选一个,二选一,很像二分图吧,对能互吃的两个棋子连线,在所选的任意两个棋子中,都不能互相有连线,这不就是最大点独立集吗?
最大独立集 = 顶点个数 - 最大匹配。记得把坏了的格子去掉。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 6 int n,m,tot; 7 int mp[205][205], head[40005], mark[40005]; 8 bool vis[40005]; 9 10 struct node 11 { 12 int v,next; 13 }e[8*40005]; 14 15 int dx[] = {-2,-2,-1,-1,1,1,2,2}; 16 int dy[] = {1,-1,2,-2,2,-2,1,-1}; 17 18 void addEdge(int u, int v) 19 { 20 e[tot].v = v; 21 e[tot].next = head[u]; 22 head[u] = tot++; 23 } 24 25 bool match(int u) 26 { 27 for(int i=head[u];i!=-1;i=e[i].next) 28 { 29 int v = e[i].v; 30 if(!vis[v]) 31 { 32 vis[v] = true; 33 if(mark[v]==-1 || match(mark[v])) 34 { 35 mark[v] = u; 36 return true; 37 } 38 } 39 } 40 return false; 41 } 42 43 int main() 44 { 45 //freopen("in.txt","r",stdin); 46 int num = 0; 47 scanf("%d%d",&n,&m); 48 for(int i=1;i<=n;i++) 49 for(int j=1;j<=m;j++) 50 { 51 scanf("%d",&mp[i][j]); 52 if(mp[i][j]) num++; 53 } 54 tot = 0; 55 memset(head,-1,sizeof(head)); 56 for(int i=1;i<=n;i++) 57 for(int j=1;j<=m;j++) 58 { 59 if(!mp[i][j]) 60 { 61 for(int k=0;k<8;k++) 62 { 63 int x = i+dx[k]; 64 int y = j+dy[k]; 65 if(x<1 || x>n || y<1 || y>m) continue; 66 if(mp[x][y]==1) continue; 67 int p1 = (i-1)*m+j; 68 int p2 = (x-1)*m+y; 69 addEdge(p1,p2); 70 } 71 } 72 } 73 int sum = 0; 74 memset(mark,-1,sizeof(mark)); 75 for(int i=1;i<=n*m;i++) 76 { 77 memset(vis,false,sizeof(vis)); 78 if(match(i)) sum++; 79 } 80 printf("%d\n",n*m-num-sum/2); 81 return 0; 82 }
转载于:https://www.cnblogs.com/zyb993963526/p/7904002.html
BZOJ 4808: 马(二分图最大点独立集)相关推荐
- BZOJ 4808(马-二分图最大独立集)
4808: 马 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 111 Solved: 46 [Submit][Status][Discuss] Des ...
- LightOJ1171 Knights in Chessboard (II)(二分图最大点独立集)
题目 Source http://www.lightoj.com/volume_showproblem.php?problem=1171 Description Given an m x n ches ...
- BZOJ 4808 二分图最大点独立集
4808: 马 Description 众所周知,马后炮是中国象棋中很厉害的一招必杀技."马走日字".本来,如果在要去的方向有别的棋子挡住(俗 称"蹩马腿"), ...
- [bzoj 4808]马
众所周知,马后炮是中国象棋中很厉害的一招必杀技."马走日字".本来,如果在要去的方向有别的棋子挡住(俗称"蹩马腿"),则不允许走过去.为了简化问题,我们不考虑这 ...
- bzoj 4808: 马
题意: 在图上放最多马,使它们不能相互攻击. 题解: 同bzoj 攻击装置.3175 一开始狂T,抄了个偏移量竟然快了10几倍? 玄学-- code: #include<cstdio> # ...
- 解题:BZOJ 4808 马
题面 以前写过的题,翻出来学习网络流写二分图匹配,因为复杂度更优秀,$Dinic$是$O(sqrt(n)m)$哒~ 原点向左部点连流量为$1$的边,左部点向对应右部点连流量为$1$的边,右部点向汇点连 ...
- bzoj 4808: 马【匈牙利算法】
网格图黑白染色,然后能互相攻击到的点之间连边,跑匈牙利算法最大匹配,答案是好点个数-最大匹配(最大独立集) 注意pao的时候只从一种颜色的格子统计即可 #include<iostream> ...
- 二分图----最大匹配,最小点覆盖,最大点独立集
一.二分图 二分图又称作二部图,是图论中的一种特殊模型. 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不 ...
- 求解二分图的独立集问题
一.题目: 当G为二分图时,试给出一个有效的算法以求解独立集问题.分析算法的运行时间,并证明算法的正确性 二.算法思路: 首先明确几个概念: 匹配E': E'为边集E的子集,E'中各边均不相邻(或者说 ...
最新文章
- 设置vue运行npm run dev时候,项目在浏览器自动打开页面的方法
- 2019金融科技风往哪儿吹?蚂蚁金服联合20余家金融机构预测新年热点:5G、区块链上榜...
- php es6写法,ES6...扩展运算符(示例代码)
- C++ Primer 5th笔记(chap 17 标准库特殊设施)匹配与 Regex 迭代器类型
- java 注释 超链接_java_Java代码注释规范详解,代码附有注释对程序开发者来 - phpStudy...
- Log4j 2使用教程
- python里类的概念
- 解决VM 与 Device/Credential Guard 不兼容。在禁用 Device/Credential Guard 后,可以运行 VM 的方法
- 如何为回归问题,选择最合适的机器学习方法?
- 【Opencv系列】之显示图像以及使用鼠标截取图像局部区域进行放大
- mysql关闭显示无权限_如何关闭mysql远程登录权限
- Android中的Handler的机制与用法详解
- C语言-字符型数据与ASCII码表
- win10 IDE改AHCI,无需重装系统
- 荣耀play的android版本,荣耀Play3搭载了哪个版本系统 聪明的系统更懂你
- 2022-2028年全球与中国便携式茶包市场现状及未来发展趋势分析报告
- php 检测链接,PHP检测链接是否存在的代码实例分享
- php amr格式转换,php 微信amr转mp3的方法
- 全文标明引文报告html,知网查重报告之全文(标明引文)报告单参数详解
- 程序员拒绝春节带电脑回家被开除;小米国行不再支持安装Google框架;Excel具备图灵完备性,成第一大编程语言 | 架构视点...