博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ZOJ1516 Uncle Tom's Inherited Land(二分图最大匹配)
阅读量:5321 次
发布时间:2019-06-14

本文共 1522 字,大约阅读时间需要 5 分钟。

一个经典的构图:对格子进行黑白染色,黑白的点分别作XY部的点。

这一题的边就是可以出售的单位面积2的土地,边的端点就是这个土地占用的X部和Y部的两个点。

这样就建好二分图,要求最多土地的答案显然是这个二分图的最大边独立集,也就是最大匹配。

1 #include
2 #include
3 #include
4 #include
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
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]

 

转载于:https://www.cnblogs.com/WABoss/p/5134418.html

你可能感兴趣的文章
倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-点击运行按钮进入到运行状态报错Error starting TwinCAT System怎么办 AdsWarning1823怎么办...
查看>>
【转】javascript 中的很多有用的东西
查看>>
Centos7.2正常启动关闭CDH5.16.1
查看>>
Android 监听返回键、HOME键
查看>>
Android ContentProvider的实现
查看>>
sqlserver 各种判断是否存在(表名、函数、存储过程等)
查看>>
给C#学习者的建议 - CLR Via C# 读后感
查看>>
Recover Binary Search Tree
查看>>
Java 实践:生产者与消费者
查看>>
[转]IOCP--Socket IO模型终结篇
查看>>
js 获取视频的第一帧
查看>>
各种正则验证
查看>>
观察者模式(Observer)
查看>>
python中numpy.r_和numpy.c_
查看>>
egret3D与2D混合开发,画布尺寸不一致的问题
查看>>
freebsd 实现 tab 命令 补全 命令 提示
查看>>
struts1和struts2的区别
查看>>
函数之匿名函数
查看>>
shell习题第16题:查用户
查看>>
实验4 [bx]和loop的使用
查看>>