ZOJ1516 Uncle Tom's Inherited Land(二分图最大匹配)
一个经典的构图:对格子进行黑白染色,黑白的点分别作XY部的点。
这一题的边就是可以出售的单位面积2的土地,边的端点就是这个土地占用的X部和Y部的两个点。
这样就建好二分图,要求最多土地的答案显然是这个二分图的最大边独立集,也就是最大匹配。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<queue> 5 using namespace std; 6 #define MAXN 11111 7 #define MAXM 111111 8 #define INF 1<<30 9 struct Edge{ 10 int v,cap,flow,next; 11 }edge[MAXM]; 12 int vs,vt,NE,NV; 13 int head[MAXN]; 14 15 void addEdge(int u,int v,int cap){ 16 edge[NE].v=v; edge[NE].cap=cap; edge[NE].flow=0; 17 edge[NE].next=head[u]; head[u]=NE++; 18 edge[NE].v=u; edge[NE].cap=0; edge[NE].flow=0; 19 edge[NE].next=head[v]; head[v]=NE++; 20 } 21 22 int level[MAXN]; 23 int gap[MAXN]; 24 void bfs(){ 25 memset(level,-1,sizeof(level)); 26 memset(gap,0,sizeof(gap)); 27 level[vt]=0; 28 gap[level[vt]]++; 29 queue<int> que; 30 que.push(vt); 31 while(!que.empty()){ 32 int u=que.front(); que.pop(); 33 for(int i=head[u]; i!=-1; i=edge[i].next){ 34 int v=edge[i].v; 35 if(level[v]!=-1) continue; 36 level[v]=level[u]+1; 37 gap[level[v]]++; 38 que.push(v); 39 } 40 } 41 } 42 43 int pre[MAXN]; 44 int cur[MAXN]; 45 int ISAP(){ 46 bfs(); 47 memset(pre,-1,sizeof(pre)); 48 memcpy(cur,head,sizeof(head)); 49 int u=pre[vs]=vs,flow=0,aug=INF; 50 gap[0]=NV; 51 while(level[vs]<NV){ 52 bool flag=false; 53 for(int &i=cur[u]; i!=-1; i=edge[i].next){ 54 int v=edge[i].v; 55 if(edge[i].cap!=edge[i].flow && level[u]==level[v]+1){ 56 flag=true; 57 pre[v]=u; 58 u=v; 59 //aug=(aug==-1?edge[i].cap:min(aug,edge[i].cap)); 60 aug=min(aug,edge[i].cap-edge[i].flow); 61 if(v==vt){ 62 flow+=aug; 63 for(u=pre[v]; v!=vs; v=u,u=pre[u]){ 64 edge[cur[u]].flow+=aug; 65 edge[cur[u]^1].flow-=aug; 66 } 67 //aug=-1; 68 aug=INF; 69 } 70 break; 71 } 72 } 73 if(flag) continue; 74 int minlevel=NV; 75 for(int i=head[u]; i!=-1; i=edge[i].next){ 76 int v=edge[i].v; 77 if(edge[i].cap!=edge[i].flow && level[v]<minlevel){ 78 minlevel=level[v]; 79 cur[u]=i; 80 } 81 } 82 if(--gap[level[u]]==0) break; 83 level[u]=minlevel+1; 84 gap[level[u]]++; 85 u=pre[u]; 86 } 87 return flow; 88 } 89 90 bool map[111][111]; 91 int main(){ 92 int n,m,a,b,c; 93 while(~scanf("%d%d",&n,&m) && (n||m)){ 94 memset(map,0,sizeof(map)); 95 scanf("%d",&c); 96 while(c--){ 97 scanf("%d%d",&a,&b); 98 --a; --b; 99 map[a][b]=1; 100 } 101 vs=n*m; vt=vs+1; NV=vt+1; NE=0; 102 memset(head,-1,sizeof(head)); 103 for(int i=0; i<n; ++i){ 104 for(int j=0; j<m; ++j){ 105 if((i+j)&1) addEdge(vs,i*m+j,1); 106 else addEdge(i*m+j,vt,1); 107 if(map[i][j]) continue; 108 if(i+1<n && !map[i+1][j]){ 109 if((i+j)&1) addEdge(i*m+j,(i+1)*m+j,1); 110 else addEdge((i+1)*m+j,i*m+j,1); 111 } 112 if(j+1<m && !map[i][j+1]){ 113 if((i+j)&1) addEdge(i*m+j,i*m+j+1,1); 114 else addEdge(i*m+j+1,i*m+j,1); 115 } 116 } 117 } 118 printf("%d\n",ISAP()); 119 } 120 return 0; 121 }
转载于:https://www.cnblogs.com/WABoss/p/5134418.html
ZOJ1516 Uncle Tom's Inherited Land(二分图最大匹配)相关推荐
- HDU 1507 Uncle Tom's Inherited Land(最大匹配+分奇偶部分)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1507 题目大意:给你一张n*m大小的图,可以将白色正方形凑成1*2的长方形,问你最多可以凑出几块,并输 ...
- HDU1507 Uncle Tom's Inherited Land*
题目是跟 zoj1516是一样的,但多了匹配后的输出 详解zoj1516可见http://www.cnblogs.com/CSU3901130321/p/4228057.html 1 #include ...
- ZOJ 1516 Uncle Tom's Inherited Land
题目大意: 除去那些作为荷塘的土地块,将剩余的土地希望每次将两块相邻的地一起卖出,最多能卖出多少种这样的由相邻土地 合成的长方形土地块 很明显的二分图问题,但是要考虑如何建模 一个长方形土地总是由相邻 ...
- hdu 1507 Uncle Tom's Inherited Land*
这两天刚学二分图,对二分图的应用还不熟练;感觉自己还是太弱了,这题是参考别人代码的; 这题是把(i+j)的值得奇偶性来分图的,请原谅我没有想到,还是太水了..根本没有思路.. 先用一个数组暂时存起鱼塘 ...
- 解题报告 (九) 二分图最大匹配
文章目录 二分图最大匹配 解题报告 一.最大匹配模板题 HDU 1083 Courses HDU 2063 过山车 HDU 1528 Card Game Cheater HDU 1179 Olliva ...
- HDU - 5090 Game with Pearls(二分图最大匹配)
题目链接:点击查看 题目大意:杰瑞和汤姆在玩游戏,游戏规则是:汤姆会拿来N个容器,每个容器内一开始就会包含1~N个小球,现在轮到杰瑞操作了,杰瑞可以选择往每个容器里加入0个或者任意k的倍数个小球,问杰 ...
- 【网络流24题】解题报告:A、飞行员配对方案问题(最大流求二分图最大匹配)
A.飞行员配对方案问题 (二分图最大匹配)(最大流)[提高+/省选- ] 题目链接 [问题分析] 二分图最大匹配问题. [建模方法] 在二分图的基础上增加源S和汇T. 1.S向X集合中每个顶点连一条容 ...
- 【模板】匈牙利算法 二分图最大匹配题模板
[任务] 给定一个二分图,用匈牙利算法求这个二分图的最大匹配数. [说明] 求最大匹配,那么我们希望每一个在左边的点都尽量找到右边的一个点和它匹配. 我们一次枚举左边的点x的所有出边指向的点y, 若y ...
- 51nod 2006 飞行员配对(二分图最大匹配) 裸匈牙利算法 求二分图最大匹配题
题目: 题目已经说了是最大二分匹配题, 查了一下最大二分匹配题有两种解法, 匈牙利算法和网络流. 看了一下觉得匈牙利算法更好理解, 然后我照着小红书模板打了一遍就过了. 匈牙利算法:先试着把没用过的左 ...
最新文章
- 细聊 Cocoapods 与 Xcode 工程配置
- 全球四大农业贸易数字化-丰收节贸易会:谋定粮食区块链
- java文件定时读写_java定时任务及日志的使用
- MUI侧滑导航:页面组件(本地插件化)
- Android 系统(140)---android.mk中几个常见配置
- 101 Free VMware Tools
- Windows中文编码显示问题集锦
- ubuntu记录pdf手写笔记: 数位板(硬件)+xournal(软件)
- 2022年人工智能数据标注产业现状分析
- AB测试是什么,怎么做AB测试
- u-boot与linux下网卡MAC地址的更改
- 操作系统--windows系列之windows8
- django上云步骤
- axure 7.0 license key
- python zipfile 压缩文件夹的方法
- maven 编译出现错误
- Unity tips 之文字动画效果
- 深度linux密码忘记,deepin密码忘了怎么办_deepin分区方案
- Data Science Bowl 2017数据预处理
- 关于oracle中utl_http,Oracle使用utl_http访问webservice