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。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cmath>
  4. #include <algorithm>
  5. #include <vector>
  6. #include <iomanip>
  7. #include <cstring>
  8. #include <map>
  9. #include <queue>
  10. #include <set>
  11. #include <cassert>
  12. #include <stack>
  13. #include <bitset>
  14. #define mkp make_pair
  15. using namespace std;
  16. const double EPS=1e-;
  17. typedef long long lon;
  18. const lon SZ=,SSZ=*SZ*SZ,APB=,one=,INF=0x7FFFFFFF,mod=;
  19. lon n,m,S=,T=,sum,cnt,head[SZ*SZ];
  20. lon nex[SSZ],to[SSZ],wt[SSZ],dep[SSZ];
  21. int dx[]={,},dy[]={,};
  22. char ch[SZ][SZ];
  23.  
  24. void add(int u,int v,int w)
  25. {
  26. ++cnt;
  27. nex[cnt]=head[u];
  28. head[u]=cnt;
  29. to[cnt]=v,wt[cnt]=w;
  30. }
  31.  
  32. int getid(int i,int j)
  33. {
  34. return (i-)*(m+)+j;
  35. }
  36.  
  37. void init()
  38. {
  39. cin>>n>>m;
  40. sum=n*(m+)+m*(n+),cnt=-;
  41. memset(head,-,sizeof(head));
  42. for(int i=;i<=n+;++i)
  43. {
  44. for(int j=;j<=m+;++j)
  45. {
  46. if(i==||j==||i==n+||j==m+)
  47. {
  48. ch[i][j]='D';
  49. }
  50. else
  51. {
  52. cin>>ch[i][j];
  53. if(ch[i][j]=='E')sum+=APB;
  54. }
  55. }
  56. }
  57. for(int i=;i<=n+;++i)
  58. {
  59. for(int j=;j<=m+;++j)
  60. {
  61. if(!((i+j)&))
  62. {
  63. if(ch[i][j]=='.')
  64. {
  65. add(S,getid(i,j),INF);
  66. add(getid(i,j),S,);
  67. }
  68. else if(ch[i][j]=='D')
  69. {
  70. add(getid(i,j),T,INF);
  71. add(T,getid(i,j),);
  72. }
  73. else
  74. {
  75. add(S,getid(i,j),APB);
  76. add(getid(i,j),S,);
  77. add(getid(i,j),T,APB);
  78. add(T,getid(i,j),);
  79. }
  80. }
  81. else
  82. {
  83. if(ch[i][j]=='.')
  84. {
  85. add(getid(i,j),T,INF);
  86. add(T,getid(i,j),);
  87. }
  88. else if(ch[i][j]=='D')
  89. {
  90. add(S,getid(i,j),INF);
  91. add(getid(i,j),S,);
  92. }
  93. else
  94. {
  95. add(S,getid(i,j),APB);
  96. add(getid(i,j),S,);
  97. add(getid(i,j),T,APB);
  98. add(T,getid(i,j),);
  99. }
  100. }
  101. }
  102. }
  103. for(int i=;i<=n+;++i)
  104. {
  105. for(int j=;j<=m+;++j)
  106. {
  107. for(int k=;k<;++k)
  108. {
  109. int nx=i+dx[k],ny=j+dy[k];
  110. if(i==&&nx==||j==&&ny==)continue;
  111. add(getid(i,j),getid(nx,ny),);
  112. add(getid(nx,ny),getid(i,j),);
  113. add(getid(nx,ny),getid(i,j),);
  114. add(getid(i,j),getid(nx,ny),);
  115. }
  116. }
  117. }
  118. // for(int i=1;i<=n+2;++i)
  119. // {
  120. // for(int j=1;j<=m+2;++j)
  121. // {
  122. // for(int k=head[getid(i,j)];k!=-1;k=nex[k])
  123. // {
  124. // cout<<i<<" "<<j<<" "<<to[k]<<" "<<wt[k]<<endl;
  125. // }
  126. // }
  127. // }
  128. }
  129.  
  130. bool bfs()
  131. {
  132. memset(dep,,sizeof(dep));
  133. dep[S]=;
  134. queue<int> q;
  135. q.push(S);
  136. for(;q.size();)
  137. {
  138. int fr=q.front();
  139. q.pop();
  140. for(int i=head[fr];i!=-;i=nex[i])
  141. {
  142. int t=to[i],w=wt[i];
  143. if(!dep[t]&&w)
  144. {
  145. dep[t]=dep[fr]+;
  146. q.push(t);
  147. if(t==T)return ;
  148. }
  149. }
  150. }
  151. return ;
  152. }
  153.  
  154. int dinic(int x,int flow)
  155. {
  156. if(x==T)return flow;
  157. else
  158. {
  159. int rem=flow;
  160. for(int i=head[x];i!=-&&rem;i=nex[i])
  161. {
  162. int t=to[i],w=wt[i];
  163. if(dep[t]==dep[x]+&&w)
  164. {
  165. int tmp=dinic(t,min(w,rem));
  166. if(!tmp)dep[t]=;
  167. rem-=tmp;
  168. wt[i]-=tmp;
  169. wt[i^]+=tmp;
  170. }
  171. }
  172. return flow-rem;
  173. }
  174. }
  175.  
  176. void work()
  177. {
  178. int res=;
  179. for(;bfs();)
  180. {
  181. res+=dinic(S,INF);
  182. }
  183. cout<<sum-res<<endl;
  184. }
  185.  
  186. void release()
  187. {
  188.  
  189. }
  190.  
  191. int main()
  192. {
  193. std::ios::sync_with_stdio();
  194. //freopen("d:\\1.txt","r",stdin);
  195. lon casenum;
  196. cin>>casenum;
  197. //cout<<casenum<<endl;
  198. for(int time=;time<=casenum;++time)
  199. //for(int time=1;cin>>n>>m,n;++time)
  200. {
  201. cout<<"Case "<<time<<": ";
  202. init();
  203. work();
  204. release();
  205. }
  206. return ;
  207. }

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. Oracle游标介绍

    Oracle游标使用详解: 游标: 用来查询数据库,获取记录集合(结果集)的指针,我们所说的游标通常是指显式游标,因此从现在起没有特别指明的情况,我们所说的游标都是指显式游标.要在程序中使用游标,必须 ...

  2. 迷宫问题 (bfs广度优先搜索记录路径)

    问题描述: 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, ...

  3. 使用 dom4j 处理 xml (2)

    记录一些 xpath 的常规用法,备忘. //3.XPath 了解(用于在xml中选取元素,类似 jquery 选择器) //3.1 路径 Node node1 = root.selectSingle ...

  4. Centos7 安装tomcat

  5. Why choose Nexiq USB-link 125032 Diesel Truck Diagnose

    Nexiq 125032 usb link is Diesel Truck diagnostic Interface. Nexiq truck scanner can compatible with ...

  6. redis(一主两从三哨兵模式搭建)记录

    转自:http://www.cnblogs.com/fly-piglet/p/9836314.html 目的: 让看看这篇文章的的人能够知道:软件架构.软件的安装.配置.基本运维的操作.高可用测试.也 ...

  7. DUILIB消息处理过程

    DUILIB消息处理机制 方法一. 首先窗口基类创建 CWindowWnd->Create() 调用 CWindowWnd->RegisterWindowClass() 注册 CWindo ...

  8. oracle数据库更改字符集为utf-8,亲测有效

    >shutdown immediate; (把database停了) >startup mount; (把database重开) >alter system enable restr ...

  9. 手机APP应用外网访问本地WEB应用

    手机APP应用外网访问本地WEB应用 本地安装了WEB服务端,手机APP应用只能在局域网内访问本地WEB,怎样使手机APP应用从公网也能访问本地WEB? 本文将介绍具体的实现步骤. 1. 准备工作 1 ...

  10. leetcode 最后一个单词的长度 python

    class Solution: def lengthOfLastWord(self, s): """ :type s: str :rtype: int "&qu ...