正题

题目链接:https://jzoj.net/senior/#contest/show/3014/2


题目大意

n∗mn*mn∗m的地方,每个地方有购买价格和收益,一个地方如果四周都被购买那么也可以获得这个地方的收益。

求收益-价格最大。


解题思路

考虑网络流,进行奇偶染色,对于每个格子我们拆分成xxx和x′x'x′。

有建边

  • x−>x′:valxx->x':val_xx−>x′:valx​,若割掉这条边,则不要这个点的收益
  • 对于奇点s−>x:costxs->x:cost_xs−>x:costx​,若割掉这条边,则买下这个点
  • 对于偶点x′−>t:costxx'->t:cost_xx′−>t:costx​,原理同上
  • 对于奇点xxx,和相邻的(偶)点yyy,x−>y:inf,x′−>y′:infx->y:inf,x'->y':infx−>y:inf,x′−>y′:inf这两个点之间的联系,且该联系不可破坏。

然后跑最小割即可。


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define p(x,y,z) (((x-1)*m+y)+z*n*m)
using namespace std;
const int N=23*23*2,inf=1e9+7;
const int dx[4]={1,0,-1,0};
const int dy[4]={0,1,0,-1};
struct node{int to,next,w;
}a[N*8];
int c[21][21];
int tot=1,ls[N],dep[N];
int n,m,ans,s,t;
char z[21];
queue<int> q;
int count(char x){if(x>='0'&&x<='9')return x-'0';if(x>='a'&&x<='z')return 10+x-'a';if(x>='A'&&x<='Z')return 36+x-'A';
}
void addl(int x,int y,int w){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;a[tot].w=w;a[++tot].to=x;a[tot].next=ls[y];ls[y]=tot;a[tot].w=0;
}
bool bfs(){memset(dep,0,sizeof(dep));while(!q.empty()) q.pop();q.push(s);dep[s]=1;while(!q.empty()){int x=q.front();q.pop();for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(dep[y]||!a[i].w) continue;dep[y]=dep[x]+1;if(y==t) return 1;q.push(y);}}return 0;
}
int dinic(int x,int flow){int rest=0,k;if(x==t) return flow;for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(dep[x]+1==dep[y]&&a[i].w){rest+=(k=dinic(y,min(a[i].w,flow-rest)));a[i].w-=k;a[i^1].w+=k;if(rest==flow) return flow;}}if(!rest) dep[x]=0;return rest;
}
void net_flow(){while(bfs())ans-=dinic(s,inf);
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%s",z+1);for(int j=1;j<=m;j++)c[i][j]=count(z[j]); }s=p(n,m,1)+1;t=s+1;for(int i=1;i<=n;i++){scanf("%s",z+1);for(int j=1;j<=m;j++){int val=count(z[j]);ans+=val;addl(p(i,j,0),p(i,j,1),val);if((i+j)&1){addl(s,p(i,j,0),c[i][j]);for(int k=0;k<4;k++){int x=i+dx[k],y=j+dy[k];if(x<1||y<1||x>n||y>m) continue;addl(p(i,j,1),p(x,y,1),inf);addl(p(i,j,0),p(x,y,0),inf);}}elseaddl(p(i,j,1),t,c[i][j]);}}net_flow();printf("%d",max(ans,0));
}

jzoj4020-Revolution【网络流,最小割】相关推荐

  1. 【bzoj2521】[Shoi2010]最小生成树 网络流最小割

    题目描述 Secsa最近对最小生成树问题特别感兴趣.他已经知道如果要去求出一个n个点.m条边的无向图的最小生成树有一个Krustal算法和另一个Prim的算法.另外,他还知道,某一个图可能有多种不同的 ...

  2. 【bzoj2132】圈地计划 网络流最小割

    题目描述 最近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old Idiots)手中得到了一块开发土地.据了解,这块土地是一块矩形的区域,可以纵横划 ...

  3. 洛谷 P1646 [国家集训队]happiness 网络流 最小割 Dinic+当前弧优化

    题目链接: https://www.luogu.com.cn/problem/P1646 参考博客: https://siyuan.blog.luogu.org/solution-p1646 算法:网 ...

  4. P4897 【模板】最小割树(Gomory-Hu Tree)(网络流/最小割/树形结构)

    P4897 [模板]最小割树(Gomory-Hu Tree) 这个算法可以用来求解一个无向图上任意两点的最小割,具体过程就是每次选择两个点求最小割,然后在一个新图中这两个点连边,然后对于这两个点的连通 ...

  5. CodeForces 1517G Starry Night Camping(网络流最小割)

    CodeForces 1517G Starry Night Camping problem 洛谷链接 solution 这个平行四边形的脑洞我™真的长见识了 本题最离谱的要求就是:平行四边形的一条边平 ...

  6. 图论 —— 网络流 —— 最小割 —— 平面图与对偶图

    [平面图] 对于一个图 G=(V,E),若其重画后,在平面任意两条边的交点除了图中点外,没有其他交点,那么这个图称为平面图 在平面图中,由边包围并且其中不含顶点的区域称为面 包围面 R 的所有边组成的 ...

  7. Gym - 101982E Cops And Robbers 网络流最小割

    1.题意: 输入一个n行m列的地图,地图上有k种陷阱底座,每种陷阱必须放在相应底座上,并且有一定的花费.有一只兔子初始位置在'B'处,为了使这只兔子不能逃出地图,必须放置一些陷阱来阻拦它.问怎么样放置 ...

  8. AcWing2279 网络战争 (01分数规划+网络流 最小割模型)

    原题链接:AcWing2279 网络战争 题目大意 给一个无向带权图,求将s和t分开的一个边割集,使得割集的平均边权最小,即最小化∑e∈cwe∣c∣\frac{\sum_{e\in c} w_e}{| ...

  9. HDU 3313 Key Vertex 胡搞(网络流最小割拆点什么的人家才不会呢)

    problem大意:给you一个无loop有向graph,求它的key vertex数目.(最近刚过了英语六级,耶,1Y,炫耀~~~~~) 什么是key vertex呢?就是去掉以后从起点到不了终点了 ...

最新文章

  1. Android和iOS那个好?
  2. 数据结构之python实现顺序表
  3. Python控制流:顺序结构、分支结构、循环结构+for、if ... else、while、if... elif...elif..else、if
  4. linux系统reboot怎么退出,Linux系统肿么退出?
  5. android异常 More than one file was found with OS independent path ‘META-INF/XXX‘
  6. python生成器yield原理_生成器yield关键字详解
  7. 三十五、深入Java中的泛型(下篇)
  8. SAP Cloud for Customer里根据External Reference搜索销售订单
  9. Apache启动错误:could not bind to address[::]:443
  10. mimakatz用法_两步完成利用procdump64+mimikatz获取win用户密码
  11. int** 赋值_关于Java语言复合赋值运算符的两个问题,快来瞧瞧
  12. 中小型园区网络的基本部署之动手划分vlan
  13. JAVA正则表达式分析爬虫数据
  14. RelativeLayout addRule踩坑之旅
  15. moodle php代码解读_Moodle插件开发笔记
  16. 压力测试流程及测试步骤
  17. 怎样用计算机算出54188,计算机应用技术练习题.doc
  18. Python实训报告:学生信息管理系统
  19. 软件测试理论知识-基本概念
  20. 【关于如何输出字符串指针指向字符串地址】

热门文章

  1. micropython安装ros_ROS2与STM32入门教程-microROS的linux版本
  2. 实用金属材料手册_机械密封选用手册
  3. srv.sys蓝屏解决补丁_Win10 补丁 KB4556799 导致部分用户蓝屏死机和网络问题
  4. 北航卓越计划 计算机科学,解读:北京航空航天大学2017卓越计划自主招生条件...
  5. mysql数据聚合技术_Mysql 去重 聚合
  6. 算法设计与分析——递归与分治策略——最接近点对问题
  7. java 配置参数_给你的JAVA程序配置参数(Properties的使用)
  8. 吴恩达DeepLearningCourse3-结构化机器学习项目
  9. 蓝桥杯-卡片-填空题
  10. 7-48 银行排队问题之单窗口“夹塞”版 (30 分)(思路和详解+map做法)来呀Baby!