传送门

文章目录

  • 题意:
  • 思路:

题意:

给你一个n∗mn*mn∗m的矩阵,包含字符#和.,将#变成.的代价是ddd,将.变成#的代价是fff,让后将#和.隔开的代价是bbb,现在让你用最小的代价将#和.隔开,并且矩阵边界必须是#。
n,m≤50n,m\le 50n,m≤50

思路:

看到将两部分分开,自然的想到最小割的概念,所以引入源点和汇点考虑建图。
首先是将源点与#连容量为ddd的边,代表将#变成.的代价,割掉说明将#变成了.。
将.与汇点连代价是fff的边,意义同上。
需要注意的是,在边界上的#需要从汇点向其连一个容量为INFINFINF的边,代表其不能被变成.。
还需要将每个点向其周围连容量为bbb的边,如果四周某个点与其相同,边的含义是如果将其改变,即割掉源点跟他之间的边,那么还需要割掉原本跟他相同的之间的边。如果四周某个点跟他不同,边的含义是如果不改变,需要割掉他们俩之间的边。
让后直接建图跑就好啦。

//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid (tr[u].l+tr[u].r>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=100010,M=N*2,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int n,m;
char s[110][110];
int d,f,b;
struct Maxflow
{int n,m,S,T;int e[M],ne[M],w[M],h[N],hs[N],idx;int depth[N];void init() { idx=0; memset(h,-1,sizeof (h)); }inline void add(int a,int b,int c){e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;e[idx]=a,w[idx]=0,ne[idx]=h[b],h[b]=idx++;}bool bfs(){memset(depth,-1,sizeof (depth)); depth[S]=0;queue<int>q; q.push(S); hs[S]=h[S];while(q.size()){int t=q.front(); q.pop();for(int i=h[t];~i;i=ne[i]){int ver=e[i];if(depth[ver]==-1&&w[i]>0){depth[ver]=depth[t]+1;hs[ver]=h[ver];if(ver==T) return true;q.push(ver);}}}return false;}int dfs(int u,int flow){if(u==T) return flow;int d=flow;for(int i=hs[u];~i;i=ne[i]){int ver=e[i]; hs[u]=i;if(depth[ver]==depth[u]+1&&w[i]>0){int t=dfs(ver,min(w[i],d));if(!t) depth[ver]=-1;d-=t; w[i]-=t; w[i^1]+=t;if(!d) break;}}return flow-d;}int dinic(){int ans=0,flow;while(bfs()) while(flow=dfs(S,INF)) ans+=flow;return ans;}
}MF;
int dir[4][2]={1,0,-1,0,0,1,0,-1};int get(int i,int j) {return (i-1)*m+j;
}int main()
{//  ios::sync_with_stdio(false);
//  cin.tie(0);int _; scanf("%d",&_);while(_--) {scanf("%d%d%d%d%d",&m,&n,&d,&f,&b);for(int i=1;i<=n;i++) scanf("%s",s[i]+1);int ans=0;for(int i=1;i<=n;i++) {if(s[i][1]=='.') s[i][1]='#',ans+=f;if(s[i][m]=='.') s[i][m]='#',ans+=f;}for(int i=1;i<=m;i++) {if(s[1][i]=='.') s[1][i]='#',ans+=f;if(s[n][i]=='.') s[n][i]='#',ans+=f;}MF.init(); MF.S=N-1,MF.T=N-2;for(int i=1;i<=n;i++) {for(int j=1;j<=m;j++) {if(s[i][j]=='#') {if(i==1||j==1||i==n||j==m) MF.add(MF.S,get(i,j),INF);else MF.add(MF.S,get(i,j),d);}else MF.add(get(i,j),MF.T,f);for(int k=0;k<4;k++) {int dx=i+dir[k][0];int dy=j+dir[k][1];if(dx<1||dy<1||dx>n||dy>m) continue;MF.add(get(i,j),get(dx,dy),b);}}}ans+=MF.dinic();printf("%d\n",ans);}return 0;
}
/**/

Pool construction UVA - 1515 最小割模型相关推荐

  1. hdu 3879(最小割模型求解最大权闭合图)

    题意: 公司得到了一共N个可以作为通讯信号中转站的地址,而由于这些地址的地理位置差异,在不同的地方建造通讯中转站需要投入的成本也是不一样的,所幸在前期调查之后这些都是已知数据:建立第i个通讯中转站需要 ...

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

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

  3. 最大权闭合子图(最小割模型)

    1,定义: 1,最大权闭合子图是最小割的一个模型.即每一个子图中的每一个点,其出边的点也全应该在这个子图中.而所有子图中,其点的权值和最大就是最大权闭合子图. 2,构建该图,我们把所有正权值点与源点s ...

  4. POJ 3469 Dual Core CPU(最小割模型的建立)

    分析: 这类问题的一遍描述,把一些对象分成两组,划分有一些代价,问最小代价.一般性的思路是, 把这两组看成是S点和T点,把划分的代价和割边的容量对应起来求最小割. 把S和可模版tem之间到达关系看作是 ...

  5. 【图论】【网络流】最小割模型

    最小割 最小割应用--01规划问题 最优标号 网络战争 最大权闭合图 最大获利 最大密度子图 生活的艰辛 二分图之最小点权覆盖集 有向图破坏 二分图之最大点权独立集 王者之剑 建图实战 有线电视网络 ...

  6. 最小割 ---- 2021 ccpc 威海 H city-safety(最大利润 = 最大收益 - 最小花费(最小割))

    题目链接 题目大意: 一棵树,加强第 iii 个点有 wiw_iwi​ 的花费,而如果距离某 个点 ≤p≤ p≤p 的所有点都加强了,则会有 vpv_pvp​ 的收益,求最大净收益. 解题思路: 树形 ...

  7. BZOJ 2132 圈地计划(最小割)【BZOJ 修复工程】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2132 是 hydro 的 BZOJ ...

  8. 【网络流24题】B、太空飞行计划问题(最大权闭合图转最小割、最小割方案输出)

    整理的算法模板合集: ACM模板 B.太空飞行计划问题(最大权闭合图转最小割.最小割方案输出)[省选/NOI- ] P2762 太空飞行计划问题 [问题分析] 最大权闭合图问题,可以转化成最小割问题, ...

  9. 【网络流24题】I、 方格取数问题(二分图的最大独立集/最小割)

    I. 方格取数问题(二分图的最大独立集/最小割) [问题分析] 二分图点权最大独立集,转化为最小割模型,从而用最大流解决. [建模方法] 首先把棋盘黑白染色,使相邻格子颜色不同,所有黑色格子看做二分图 ...

最新文章

  1. 木棒,POJ(1011)
  2. 论文浅尝 | 知识图谱的不确定性衡量
  3. Android 3D emulation 架构理解
  4. OpenCV_ cv2.imshow()
  5. 机器学习经典算法笔记——KNN
  6. VB 感染EXE 程序病毒源码
  7. vue模糊搜索select取值
  8. 3-1 Aruba交换机实用配置-VSF 2020
  9. 多智时代,人工智能发展历史的时间表
  10. 跟『我的2017』做个了结
  11. mysql io瓶颈_服务器IO瓶颈对MySQL性能的影响
  12. UE4实现风格化渲染(一):UserNormalTranslator工具的使用
  13. php执行fastlane,Fastlane的使用及进阶
  14. 【MySQL 数据库 进阶】 面试考题两大查询 (聚合查询,联合查询)
  15. 【故事】P2P、BT、ED2k、FTP、磁力链接下载到底是什么鬼?
  16. 如何调换手机桌面位置_如何改变华为手机桌面三个方向按键的位置?
  17. 企业专线传输网络与普通宽带的对比
  18. 用Python爬了225座城市6758家餐厅,窥探国人吃小龙虾的不同姿势(附代码)
  19. Python玩具(一)
  20. IM即时通讯系统架构

热门文章

  1. 史上四大“杀人”建筑,烧掉几百亿,却犯低级错误,网友:有钱人的智商,我不懂
  2. Facebook 中国程序员之死
  3. 国庆中秋活动——让孩子亲近数学并爱上数学:《数学小侦探》来袭(来自科大出版社的福利)
  4. 《SAS编程与数据挖掘商业案例》学习笔记之十
  5. matlab如何求矩阵的转置矩阵,怎么用MATLAB程序求转置矩阵?急需,高手帮忙………………...
  6. 设置mysql表myisam_mysql myisam 优化设置设置
  7. 3dmax导出x文件插件2020_C4D与unity3D,3DMAX,AI,AE,ks之间互导
  8. .gpg 进程 linux,小知识之Linux系统中的最大进程数,最大文件描述,最大线程数...
  9. mysql流程控制_Mysql之流程控制结构
  10. 机器学习之数据预处理——特征编码(标签编码,独热编码)