难得的中文题,就不翻译了。

输入第一行为T,表示有T组测试数据。
每组数据以两个整数N和M开始,表示地图的规模。接下来的N行,每一行包含一个长度为M的字符串,表示地图,‘.’表示陆地,’E’表示浅海域,’D’表示深海域。
[Technical Specification]
1. 1 <= T <= 100
2. 1 <= N, M <= 47

题意:假设地图为一个N*M的格子,其中一些是陆地,一些是可以填充的浅海域,一些是不可填充的深海域。这里定义海岸线的长度为一个联通块陆地(可能包含浅海域填充变为的陆地)的边缘长度,两个格子至少有一个公共边,则视为联通。
值得注意的是,这里Z市的陆地区域可以是不联通的,并且整个地图都处在海洋之中,也就是说,Z市是由一些孤岛组成的,比如像,夏威夷?
你的任务是,填充某些浅海域,使得所有岛屿的海岸线之和最长。

输出最长海岸线和。

Solution:

一开始以为是贪心,后来发现这个规划问题好像不可以。算法是最小割,然后最小割==最大流,算法是最大流。

由于海岸线一定是海与岸的边界(废话哈哈哈~~~),不妨在给出的网格图外层加多层深海(的孤独~~~)

显然(i+j)%2==0的格子只可能和(i+j)%2==1的格子有海岸线。不妨二部图。

我们需要求的是最可能多的相邻不同对(<'D', '.'>),也就是求尽可能少的相邻相同对(<'D', 'D'>或<'.', '.'>)。

建模如图,感觉这样画图比较直观。只画出部分,还有EE相连之类的。

左右流量均为inf,中间流量为1。

显然最大流跑出来的是最少的相同对数。

答案就是 sum - mf

#pragma comment (linker,"/STACK:102400000,102400000")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
#include <queue>
#include <set>
#include <map>
#include <stack>
using namespace std;#define mxn 2600
#define mxe 26000
#define inf 0x3f3f3f3f
struct SAP{int dis[mxn],pre[mxn],gap[mxn],arc[mxn],f[mxe],cap[mxe];int head[mxn],nxt[mxe],vv[mxe],e;void init(){e=0;memset(head,-1,sizeof(head));}void addedge(int u,int v,int c){vv[e]=v,cap[e]=c,nxt[e]=head[u],head[u]=e++;vv[e]=u,cap[e]=0,nxt[e]=head[v],head[v]=e++;}int max_flow(int s,int t,int n){int q[mxn],j,mindis,ans=0,ht=0,tl=1;int u,v,low;bool found,vis[mxn];memset(dis,0,sizeof(dis));memset(gap,0,sizeof(gap));memset(vis,0,sizeof(vis));memset(arc,0,sizeof(arc));memset(f,0,sizeof(f));q[0]=t,vis[t]=true,dis[t]=0,gap[0]=1;while(ht<tl){int u = q[ht++];for(int i=head[u];i!=-1;i=nxt[i]){v = vv[i];if(!vis[v]){vis[v]=true;dis[v]=dis[u]+1;q[tl++]=v;gap[dis[v]]++;arc[v]=head[v];}}}u=s;low=inf;pre[s]=s;while(dis[s]<n){found = false;for(int &i = arc[u];i!=-1;i=nxt[i]){if(dis[vv[i]]==dis[u]-1 && cap[i]>f[i]){found = true; v=vv[i];low = min(low, cap[i]-f[i]);pre[v]=u;u=v;if(u==t){while(u!=s){u=pre[u];f[arc[u]]+=low;f[arc[u]^1]-=low;}ans+=low;low=inf;}break;}}if(found) continue;mindis = n;for(int i=head[u];i!=-1;i=nxt[i]){if(mindis>dis[vv[i]] && cap[i]>f[i]){mindis = dis[vv[j=i]];arc[u]=i;}}if(--gap[dis[u]]==0) return ans;dis[u] = mindis+1;gap[dis[u]]++;u=pre[u];}return ans;}
}sap;
char maze[55][55];
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
int main(){int t,n,m,ca=0;scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);for(int i=1;i<=n;++i) scanf("%s",maze[i]+1);for(int i=0;i<=n+1;++i) maze[i][0]=maze[i][m+1]='D';for(int j=0;j<=m+1;++j) maze[0][j]=maze[n+1][j]='D';sap.init();int src = (n+2)*(m+2);int des = src+1;for(int i=0;i<=n+1;++i){for(int j=0;j<=m+1;++j){int u = i*(m+2)+j;if((i^j)&1){if(maze[i][j]=='D') sap.addedge(u,des,inf);if(maze[i][j]=='.') sap.addedge(src,u,inf);}else {if(maze[i][j]=='.') sap.addedge(u,des,inf);if(maze[i][j]=='D') sap.addedge(src,u,inf);}for(int k=0;k<4;++k){int ii=i+dx[k];int jj=j+dy[k];if(ii<0 || jj<0 || ii>n+1||jj>m+1) continue;int u = i*(m+2)+j;int v = ii*(m+2)+jj;sap.addedge(u,v,1);}}}int mf = sap.max_flow(src,des,des+1);int sum = (n+1)*(m+2)+(n+2)*(m+1);printf("Case %d: %d\n",++ca,sum-mf);}return 0;
}

转载于:https://www.cnblogs.com/nextbin/p/4072171.html

HDU 4859 海岸线(最大流最小割)相关推荐

  1. HDU 4859 海岸线 最小割

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4859 题解: 这题考察的是最小割. 我们可以这样想:海岸线的长短变化都是E引起的,我们通过把'E'变 ...

  2. hdu 4859 海岸线【最小割---------Dinic】

    海岸线 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  3. 【HDU】4859海岸线-最小割最大独立点权变形

    hdu4859 题解 在矩形外围一圈D,将所有相邻格子连边,海岸线相当于相连的两个格子种类不同的边的数量. 如果是最小化边数就是很经典的最小割模板了,考虑将最大化问题转成最小化相连的两个格子种类相同的 ...

  4. hdu 4859 海岸线 Bestcoder Round 1

    http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...

  5. hihocoder 网络流二·最大流最小割定理

    网络流二·最大流最小割定理 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi:在上一周的Hiho一下中我们初步讲解了网络流的概念以及常规解法,小Ho你还记得内容么? ...

  6. nyoj 677 碟战(最大流最小割定理)

    碟战 时间限制:2000 ms  |  内存限制:65535 KB 难度:4 描述 知己知彼,百战不殆!在战争中如果被敌人掌握了自己的机密,失败是必然的.K国在一场战争中屡屡失败,就想到自己的某些城市 ...

  7. 洛谷 - P2598 [ZJOI2009]狼和羊的故事(最大流最小割)

    题目链接:点击查看 题目大意:给出一个 n * m 的矩阵,每个格子都有三种状态:狼.羊和空地,现在需要在相邻方格之间添加篱笆,问最少需要添加多少篱笆才能使得狼和羊分开 题目分析:最大流最小割,建图方 ...

  8. matlab实现图割算法中的最大流最小割Max-flow/min-cut问题(一)

    转载自:http://blog.csdn.net/on2way/article/details/43276155 本篇主要介绍matlab实现Max-flow/min-cut的方法,介绍一种只实现了M ...

  9. 算法小白理解最大流最小割(Maximum flow Minimum cut)问题

    网上流传的关于最大流最小割问题的全都是索然无味 的一些讲课视频,当然如果你英语能力很强,直接看外国的视频也十分好理解,但于我这种理工科渣渣来说,看懂那种专业的讲课视频是不可能的,不存在的,所以把自己对 ...

  10. 最大流最小割定理(max flow/min cut theory)

    百度文库里面有个地址,讲的比较详细. http://wenku.baidu.com/link?url=gPXhYCduLNgZaOkKIltNDAgPGwuMTpRX7a0utvVFuqDAP9o1j ...

最新文章

  1. 灵魂拷问:你看过Xgboost原文吗?
  2. 线程中这么调用类_「手撕面试官」谈谈你对JDK中Executor的理解?
  3. QT的QTextStream类的使用
  4. pythonasyncio并发编程实战_python异步编程之asyncio(百万并发)
  5. 使用ISAPI_Rewrite对asp.net实现URL重写伪静态
  6. 6426C Lab2 部署和配置证书服务
  7. Codeforces-Div312
  8. mysql导入报错1071_导入sql文件报错:1071 Specified key was too long; max key length is 767 bytes...
  9. 递归函数定义、递归应用案例-科赫雪花/雪花晶片/汉诺塔
  10. 解决vue项目在ie浏览器下白屏问题;ie运行项目报正在兼容性是图中运行,因为选中了“在兼容性视图中显示Intranet站点”
  11. 零极限:关于蓝色太阳水原理
  12. 读入一张图片,并且转化成灰度值
  13. lucene 创建索引慢的问题
  14. 百度对网站就像西门庆对潘金莲
  15. 微信小程序引入外部矢量图标(阿里巴巴矢量图标)
  16. docker具名挂载与匿名挂载
  17. 计算机0基础知识,计算机基础知识0课件.ppt
  18. Wireshark抓包实例诊断TCP连接问题
  19. 批量写入mysql数据库的Python脚本
  20. 中兴新支点安装broadcom博通wifi无线网卡驱动

热门文章

  1. 关于 Google“博客搜索”Ping 服务应用编程接口(API)
  2. 关注VS.Net 2005
  3. java 一元线性回归_Java中的多元线性回归
  4. python使用struct处理二进制数据(使用pack和unpack进行打包和解包)
  5. 计算机病毒是具有破坏性的程序6,2015年计算机二级MS Office习题及答案解析(6)
  6. Nginx源码分析 - 基础数据结构篇 - 单向链表结构 ngx_list.c(06)
  7. go - struct
  8. VS2013中安装配置和使用Boost库
  9. Mac VMWARE 安装redis
  10. python可以在多种平台运行、这体现了python语言的,Python可以在多种平台运行,这体现了Python语言的可移植特性...