一个经典的构图:对格子进行黑白染色,黑白的点分别作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(二分图最大匹配)相关推荐

  1. HDU 1507 Uncle Tom's Inherited Land(最大匹配+分奇偶部分)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1507 题目大意:给你一张n*m大小的图,可以将白色正方形凑成1*2的长方形,问你最多可以凑出几块,并输 ...

  2. HDU1507 Uncle Tom's Inherited Land*

    题目是跟 zoj1516是一样的,但多了匹配后的输出 详解zoj1516可见http://www.cnblogs.com/CSU3901130321/p/4228057.html 1 #include ...

  3. ZOJ 1516 Uncle Tom's Inherited Land

    题目大意: 除去那些作为荷塘的土地块,将剩余的土地希望每次将两块相邻的地一起卖出,最多能卖出多少种这样的由相邻土地 合成的长方形土地块 很明显的二分图问题,但是要考虑如何建模 一个长方形土地总是由相邻 ...

  4. hdu 1507 Uncle Tom's Inherited Land*

    这两天刚学二分图,对二分图的应用还不熟练;感觉自己还是太弱了,这题是参考别人代码的; 这题是把(i+j)的值得奇偶性来分图的,请原谅我没有想到,还是太水了..根本没有思路.. 先用一个数组暂时存起鱼塘 ...

  5. 解题报告 (九) 二分图最大匹配

    文章目录 二分图最大匹配 解题报告 一.最大匹配模板题 HDU 1083 Courses HDU 2063 过山车 HDU 1528 Card Game Cheater HDU 1179 Olliva ...

  6. HDU - 5090 Game with Pearls(二分图最大匹配)

    题目链接:点击查看 题目大意:杰瑞和汤姆在玩游戏,游戏规则是:汤姆会拿来N个容器,每个容器内一开始就会包含1~N个小球,现在轮到杰瑞操作了,杰瑞可以选择往每个容器里加入0个或者任意k的倍数个小球,问杰 ...

  7. 【网络流24题】解题报告:A、飞行员配对方案问题(最大流求二分图最大匹配)

    A.飞行员配对方案问题 (二分图最大匹配)(最大流)[提高+/省选- ] 题目链接 [问题分析] 二分图最大匹配问题. [建模方法] 在二分图的基础上增加源S和汇T. 1.S向X集合中每个顶点连一条容 ...

  8. 【模板】匈牙利算法 二分图最大匹配题模板

    [任务] 给定一个二分图,用匈牙利算法求这个二分图的最大匹配数. [说明] 求最大匹配,那么我们希望每一个在左边的点都尽量找到右边的一个点和它匹配. 我们一次枚举左边的点x的所有出边指向的点y, 若y ...

  9. 51nod 2006 飞行员配对(二分图最大匹配) 裸匈牙利算法 求二分图最大匹配题

    题目: 题目已经说了是最大二分匹配题, 查了一下最大二分匹配题有两种解法, 匈牙利算法和网络流. 看了一下觉得匈牙利算法更好理解, 然后我照着小红书模板打了一遍就过了. 匈牙利算法:先试着把没用过的左 ...

最新文章

  1. 细聊 Cocoapods 与 Xcode 工程配置
  2. 全球四大农业贸易数字化-丰收节贸易会:谋定粮食区块链
  3. java文件定时读写_java定时任务及日志的使用
  4. MUI侧滑导航:页面组件(本地插件化)
  5. Android 系统(140)---android.mk中几个常见配置
  6. 101 Free VMware Tools
  7. Windows中文编码显示问题集锦
  8. ubuntu记录pdf手写笔记: 数位板(硬件)+xournal(软件)
  9. 2022年人工智能数据标注产业现状分析
  10. AB测试是什么,怎么做AB测试
  11. u-boot与linux下网卡MAC地址的更改
  12. 操作系统--windows系列之windows8
  13. django上云步骤
  14. axure 7.0 license key
  15. python zipfile 压缩文件夹的方法
  16. maven 编译出现错误
  17. Unity tips 之文字动画效果
  18. 深度linux密码忘记,deepin密码忘了怎么办_deepin分区方案
  19. Data Science Bowl 2017数据预处理
  20. 关于oracle中utl_http,Oracle使用utl_http访问webservice

热门文章

  1. 基于DSP的注塑机运动控制器和算法设计
  2. EMC设计技巧及经验总结4:ESD防护布线指导
  3. 酒店同质化时代,荟语酒店如何通过精准定位突围出圈
  4. 使用阿里云实现短信发送服务(测试版)
  5. Svn主分支次分支合并和版本回退
  6. 一辆适合长途出行的电动跑车 奥迪RS e-tron GT正式上市
  7. android设备连接win10,win10手机连接Android设备、iphone 操作方法
  8. 基于Java的飞机大战游戏的设计与实现论文
  9. 【新塘N76E003】NU-LINK脱机烧写
  10. ChatGPT助力之论文速成秘籍