HDU 4859 海岸线(最大流最小割)
难得的中文题,就不翻译了。
输入第一行为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 海岸线(最大流最小割)相关推荐
- HDU 4859 海岸线 最小割
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4859 题解: 这题考察的是最小割. 我们可以这样想:海岸线的长短变化都是E引起的,我们通过把'E'变 ...
- hdu 4859 海岸线【最小割---------Dinic】
海岸线 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- 【HDU】4859海岸线-最小割最大独立点权变形
hdu4859 题解 在矩形外围一圈D,将所有相邻格子连边,海岸线相当于相连的两个格子种类不同的边的数量. 如果是最小化边数就是很经典的最小割模板了,考虑将最大化问题转成最小化相连的两个格子种类相同的 ...
- hdu 4859 海岸线 Bestcoder Round 1
http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...
- hihocoder 网络流二·最大流最小割定理
网络流二·最大流最小割定理 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi:在上一周的Hiho一下中我们初步讲解了网络流的概念以及常规解法,小Ho你还记得内容么? ...
- nyoj 677 碟战(最大流最小割定理)
碟战 时间限制:2000 ms | 内存限制:65535 KB 难度:4 描述 知己知彼,百战不殆!在战争中如果被敌人掌握了自己的机密,失败是必然的.K国在一场战争中屡屡失败,就想到自己的某些城市 ...
- 洛谷 - P2598 [ZJOI2009]狼和羊的故事(最大流最小割)
题目链接:点击查看 题目大意:给出一个 n * m 的矩阵,每个格子都有三种状态:狼.羊和空地,现在需要在相邻方格之间添加篱笆,问最少需要添加多少篱笆才能使得狼和羊分开 题目分析:最大流最小割,建图方 ...
- matlab实现图割算法中的最大流最小割Max-flow/min-cut问题(一)
转载自:http://blog.csdn.net/on2way/article/details/43276155 本篇主要介绍matlab实现Max-flow/min-cut的方法,介绍一种只实现了M ...
- 算法小白理解最大流最小割(Maximum flow Minimum cut)问题
网上流传的关于最大流最小割问题的全都是索然无味 的一些讲课视频,当然如果你英语能力很强,直接看外国的视频也十分好理解,但于我这种理工科渣渣来说,看懂那种专业的讲课视频是不可能的,不存在的,所以把自己对 ...
- 最大流最小割定理(max flow/min cut theory)
百度文库里面有个地址,讲的比较详细. http://wenku.baidu.com/link?url=gPXhYCduLNgZaOkKIltNDAgPGwuMTpRX7a0utvVFuqDAP9o1j ...
最新文章
- 灵魂拷问:你看过Xgboost原文吗?
- 线程中这么调用类_「手撕面试官」谈谈你对JDK中Executor的理解?
- QT的QTextStream类的使用
- pythonasyncio并发编程实战_python异步编程之asyncio(百万并发)
- 使用ISAPI_Rewrite对asp.net实现URL重写伪静态
- 6426C Lab2 部署和配置证书服务
- Codeforces-Div312
- mysql导入报错1071_导入sql文件报错:1071 Specified key was too long; max key length is 767 bytes...
- 递归函数定义、递归应用案例-科赫雪花/雪花晶片/汉诺塔
- 解决vue项目在ie浏览器下白屏问题;ie运行项目报正在兼容性是图中运行,因为选中了“在兼容性视图中显示Intranet站点”
- 零极限:关于蓝色太阳水原理
- 读入一张图片,并且转化成灰度值
- lucene 创建索引慢的问题
- 百度对网站就像西门庆对潘金莲
- 微信小程序引入外部矢量图标(阿里巴巴矢量图标)
- docker具名挂载与匿名挂载
- 计算机0基础知识,计算机基础知识0课件.ppt
- Wireshark抓包实例诊断TCP连接问题
- 批量写入mysql数据库的Python脚本
- 中兴新支点安装broadcom博通wifi无线网卡驱动
热门文章
- 关于 Google“博客搜索”Ping 服务应用编程接口(API)
- 关注VS.Net 2005
- java 一元线性回归_Java中的多元线性回归
- python使用struct处理二进制数据(使用pack和unpack进行打包和解包)
- 计算机病毒是具有破坏性的程序6,2015年计算机二级MS Office习题及答案解析(6)
- Nginx源码分析 - 基础数据结构篇 - 单向链表结构 ngx_list.c(06)
- go - struct
- VS2013中安装配置和使用Boost库
- Mac VMWARE 安装redis
- python可以在多种平台运行、这体现了python语言的,Python可以在多种平台运行,这体现了Python语言的可移植特性...