1.地图周围再加一圈海

2.周长最多为sum=n*(m+1)+m*(n+1)。如果有邻接相同,要减1.最小割使相同最少。结果为sum-最小割

3.但是有E海滩,两边都能选。让E到S,T都连一个很大的数(10000,比最小割大就行)。这样最小割时两个10000一定要选一个。那么在sum中也加上10000就能消除。这样一定割一边而且不都割。而且连S,和T都为一样的数能确保消去E的决策的干扰。

剩下的就和套路一样了,奇偶建图,偶数时,'.'连S     INF,'D'连T   INF,E连S,T     10000。邻接互相连1。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <iomanip>
#include <cstring>
#include <map>
#include <queue>
#include <set>
#include <cassert>
#include <stack>
#include <bitset>
#define mkp make_pair
using namespace std;
const double EPS=1e-;
typedef long long lon;
const lon SZ=,SSZ=*SZ*SZ,APB=,one=,INF=0x7FFFFFFF,mod=;
lon n,m,S=,T=,sum,cnt,head[SZ*SZ];
lon nex[SSZ],to[SSZ],wt[SSZ],dep[SSZ];
int dx[]={,},dy[]={,};
char ch[SZ][SZ]; void add(int u,int v,int w)
{
++cnt;
nex[cnt]=head[u];
head[u]=cnt;
to[cnt]=v,wt[cnt]=w;
} int getid(int i,int j)
{
return (i-)*(m+)+j;
} void init()
{
cin>>n>>m;
sum=n*(m+)+m*(n+),cnt=-;
memset(head,-,sizeof(head));
for(int i=;i<=n+;++i)
{
for(int j=;j<=m+;++j)
{
if(i==||j==||i==n+||j==m+)
{
ch[i][j]='D';
}
else
{
cin>>ch[i][j];
if(ch[i][j]=='E')sum+=APB;
}
}
}
for(int i=;i<=n+;++i)
{
for(int j=;j<=m+;++j)
{
if(!((i+j)&))
{
if(ch[i][j]=='.')
{
add(S,getid(i,j),INF);
add(getid(i,j),S,);
}
else if(ch[i][j]=='D')
{
add(getid(i,j),T,INF);
add(T,getid(i,j),);
}
else
{
add(S,getid(i,j),APB);
add(getid(i,j),S,);
add(getid(i,j),T,APB);
add(T,getid(i,j),);
}
}
else
{
if(ch[i][j]=='.')
{
add(getid(i,j),T,INF);
add(T,getid(i,j),);
}
else if(ch[i][j]=='D')
{
add(S,getid(i,j),INF);
add(getid(i,j),S,);
}
else
{
add(S,getid(i,j),APB);
add(getid(i,j),S,);
add(getid(i,j),T,APB);
add(T,getid(i,j),);
}
}
}
}
for(int i=;i<=n+;++i)
{
for(int j=;j<=m+;++j)
{
for(int k=;k<;++k)
{
int nx=i+dx[k],ny=j+dy[k];
if(i==&&nx==||j==&&ny==)continue;
add(getid(i,j),getid(nx,ny),);
add(getid(nx,ny),getid(i,j),);
add(getid(nx,ny),getid(i,j),);
add(getid(i,j),getid(nx,ny),);
}
}
}
// for(int i=1;i<=n+2;++i)
// {
// for(int j=1;j<=m+2;++j)
// {
// for(int k=head[getid(i,j)];k!=-1;k=nex[k])
// {
// cout<<i<<" "<<j<<" "<<to[k]<<" "<<wt[k]<<endl;
// }
// }
// }
} bool bfs()
{
memset(dep,,sizeof(dep));
dep[S]=;
queue<int> q;
q.push(S);
for(;q.size();)
{
int fr=q.front();
q.pop();
for(int i=head[fr];i!=-;i=nex[i])
{
int t=to[i],w=wt[i];
if(!dep[t]&&w)
{
dep[t]=dep[fr]+;
q.push(t);
if(t==T)return ;
}
}
}
return ;
} int dinic(int x,int flow)
{
if(x==T)return flow;
else
{
int rem=flow;
for(int i=head[x];i!=-&&rem;i=nex[i])
{
int t=to[i],w=wt[i];
if(dep[t]==dep[x]+&&w)
{
int tmp=dinic(t,min(w,rem));
if(!tmp)dep[t]=;
rem-=tmp;
wt[i]-=tmp;
wt[i^]+=tmp;
}
}
return flow-rem;
}
} void work()
{
int res=;
for(;bfs();)
{
res+=dinic(S,INF);
}
cout<<sum-res<<endl;
} void release()
{ } int main()
{
std::ios::sync_with_stdio();
//freopen("d:\\1.txt","r",stdin);
lon casenum;
cin>>casenum;
//cout<<casenum<<endl;
for(int time=;time<=casenum;++time)
//for(int time=1;cin>>n>>m,n;++time)
{
cout<<"Case "<<time<<": ";
init();
work();
release();
}
return ;
}

hdoj4859海岸线的更多相关文章

  1. HDU 4859 海岸线(最大流最小割)

    难得的中文题,就不翻译了. 输入第一行为T,表示有T组测试数据.每组数据以两个整数N和M开始,表示地图的规模.接下来的N行,每一行包含一个长度为M的字符串,表示地图,‘.’表示陆地,’E’表示浅海域, ...

  2. HDU4859 海岸线(最小割)

    题目大概就是说一个n*m的地图,地图上每一块是陆地或浅海域或深海域,可以填充若干个浅海域使其变为陆地,问能得到的最长的陆地海岸线是多少. 也是很有意思的一道题. 一开始想歪了,想着,不考虑海岸线重合的 ...

  3. hdu 4859 海岸线 最小割

    海岸线 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=4859 Description 欢迎来到珠海! 由于土地资源越来越紧张,使得许多海滨城市都只能 ...

  4. 【HDU4859】 海岸线(网络流-最小割)

    Problem Description 欢迎来到珠海! 由于土地资源越来越紧张,使得许多海滨城市都只能依靠填海来扩展市区以求发展.作为Z市的决策人,在仔细观察了Z市地图之后,你准备通过填充某些海域来扩 ...

  5. HDU 4859(Bestcoder #1 1003)海岸线(网络流之最小割)

    题目地址:HDU4859 做了做杭电多校,知识点会的太少了.还是将重点放在刷专题补知识点上吧,明年的多校才是重点. 这题题目求的最长周长.能够试想一下,这里的海岸线一定是在"."和 ...

  6. HDU 4859 海岸线(最小割+最大独立点权变形)

    http://acm.hdu.edu.cn/showproblem.php?pid=4859 题意: 欢迎来到珠海!由于土地资源越来越紧张,使得许多海滨城市都只能依靠填海来扩展市区以求发展.作为Z市的 ...

  7. Koch 分形,海岸线,雪花

    此算法用于生成Koch分形(海岸线,雪花).速度高速,效果绚丽 //支持的初始直线水平角度为60 的倍数. 交换起点与终点坐标可改变生成方向 void Koch(CDC *pDC, int x1, i ...

  8. 【hdu 4859】海岸线(图论--网络流最小割)

    题意:有一个区域,有'.'的陆地,'D'的深海域,'E'的浅海域.其中浅海域可以填充为陆地.这里的陆地区域不联通,并且整个地图都处在海洋之中.问填充一定浅海域之后所有岛屿的最长的海岸线之和. 解法:最 ...

  9. 海岸线、科赫曲线、turtle、递归

    本章绘图要点: turtle模块:python标准库自带的一个模块,可用来绘制二维图形.该模块封装了底层的数据处理逻辑,向外提供了更符合手工绘图习惯的接口函数,适用于绘制对质量.精度要求不高的图形. ...

随机推荐

  1. gcc 中__thread 关键字的示例代码

    __thread 关键字的解释:   Thread Local Storage  线程局部存储(tls)是一种机制,通过这一机制分配的变量,每个当前线程有一个该变量的实例. gcc用于实现tls的运行 ...

  2. 关于SimpleDateFormat安全的时间格式化线程安全问题

    想必大家对SimpleDateFormat并不陌生.SimpleDateFormat 是 Java 中一个非常常用的类,该类用来对日期字符串进行解析和格式化输出,但如果使用不小心会导致非常微妙和难以调 ...

  3. java-redis

    pom.xml添加如下配置: <dependency> <groupId>org.springframework.boot</groupId> <artifa ...

  4. CentOS 7 安装Apache 2.4.39

    使用源码在CentOS 7下安装 apache 2.4.39,之前趟了一遍,简单做个笔记. STEP 1 安装apr STEP 1.1 检查是否安装apr [root@study ~]# yum li ...

  5. 关于babel官网的学习

    提起babel,前端er大概都不陌生.但是为什么要有babel呢?解决了什么问题?怎么使用babel呢?注意点在哪?以下就从这几个方面总结一下我关于babel学习的结果吧. 为什么要有babel呢? ...

  6. redis php操作命令

    redis的五种存储类型的具体用法 String 类型操作 string是redis最基本的类型,而且string类型是二进制安全的.意思是redis的string可以包含任何数据.比如jpg图片或者 ...

  7. 网易blog服务器关闭了,我曾经的大部分博文迁移至此,留作纪念。欢迎大家去我的简书blog~

    ARM时代过去了,另一个AI时代正在上演~ 这一次我看上了计算机视觉,一个依旧在发展,论文数量不断上升的技术领域,还有很多待研究的技术突破点,我可以玩的时间长一点了. 活到老,学到了.学以致用乐趣无穷 ...

  8. 使用xshell从远程服务器下载文件到本地

    XSHELL工具上传文件到Linux以及下载文件到本地(Windows) Xshell很好用,然后有时候想在windows和linux上传或下载某个文件,其实有个很简单的方法就是rz,sz.首先你的L ...

  9. 软件测试实验二----selenium、katalon、junit

    1.安装firefox和seleniumIDE.katalon 安装按成后在Firefox中有seleniumIDE.katalon的图标 2.使用katalon导出测试脚本 点击katalon的插件 ...

  10. bzoj 4770 图样 - 概率与期望 - 动态规划

    题目传送门 传送门I 传送门II 题目大意 有一个$n$个点的完全图,每个点的权值是$[0, 2^{m})$中的随机整数,两点间的边的权值是两点点权的异或和,问它的最小异或生成树的边权和的期望. 考虑 ...