Problem Description欢迎来到珠海! 由于土地资源越来越紧张,使得许多海滨城市都只能依靠填海来扩展市区以求发展。作为Z市的决策人,在仔细观察了Z市地图之后,你准备通过填充某些海域来扩展Z市的海岸线到最长,来吸引更多的游客前来旅游度假。为了简化问题,假设地图为一个N*M的格子,其中一些是陆地,一些是可以填充的浅海域,一些是不可填充的深海域。这里定义海岸线的长度为一个联通块陆地(可能包含浅海域填充变为的陆地)的边缘长度,两个格子至少有一个公共边,则视为联通。 值得注意的是,这里Z市的陆地区域可以是不联通的,并且整个地图都处在海洋之中,也就是说,Z市是由一些孤岛组成的,比如像,夏威夷? 你的任务是,填充某些浅海域,使得所有岛屿的海岸线之和最长。
Input输入第一行为T,表示有T组测试数据。 每组数据以两个整数N和M开始,表示地图的规模。接下来的N行,每一行包含一个长度为M的字符串,表示地图,‘.’表示陆地,’E’表示浅海域,’D’表示深海域。 [Technical Specification] 1. 1 <= T <= 100 2. 1 <= N, M <= 47
Output对每组数据,先输出为第几组数据,然后输出最长的海岸线长度。
Sample Input3 2 2 EE EE 3 3 EEE .E. EEE 3 3 EEE DED EEE
Sample OutputCase 1: 8 Case 2: 16 Case 3: 20Hint对于第三组样例,一种可行方案是: .E. D.D .E. 这样5个孤立小岛的海岸线总长为4 * 5 = 20。
【分析】
网络流构图。
最小割定理:最小割等于最大流。
引用一段:
因为E有两个选择D或者. 其实就暗含了最小割的模型。 最小割的话,就是一部分分到源点一侧,一部分分到汇点一侧。
如果把源点分在一起当成是. 和汇点分在一起当成是D. 那么建图的时候,相邻的建流量为1的边。 如果这个点本来是. 那个连汇点是INF,本来是D的,连源点是INF。
如果是这种建图的话,最小割求出来的最小周长。
我们需要的最大周长。
稍微转化下。 我们希望相邻格子不同的最多,其实就是要相邻格子相同的最少。
所以用最小割来求相邻格子相同的最小值,然后总相邻数减掉这个就是答案了。
建图方法就是一开始进行奇偶染色。相当于对于点(x,y)
如果(x+y)%2 == 0 那么当成这个格子是 . 的,和源点分在一起。
如果(x+y)%2 == 1 那么当成这个格子是 D 的,和汇点分在一起。
相邻两点都建边。
这样建图的话,如果在源点一侧的跑到了汇点一侧,那么就相当于这个点从.变到D, 自然相同的数量要减少了、
汇点一侧的跑到了源点一侧,那么就相当于这个点从D变成了.
建图的时候,如果(x+y)%2==0 && 这个点本来就是D 或者 (x+y)%2 == 1 && 这个点本来就是. 那么这个点必须和汇点在一起,就把这个点和源点连INF的边。 相反情况类似处理。
这样建图出来的最小割,一定就是相邻格子是同一类的最小数量。总相邻减掉这个值就是答案了。
即如图所示:
对于右边绿色的图的情况的(1,1)点和(1,2)点连边如图所示。(蓝色为边的编号,橙色为流量)
上面棕色点为(1,1) 下面棕色点为(1,2)
割边1表示点(1,1)为陆,割边2表示点(1,1)为海 割边4表示点(1,2)为海,割边5表示点(1,2)为陆
因为有双向边3,所以当两点同为陆或者海,必须把3号边也割了(花费1),图才能分割开。
一开始假设所有有可能的(即不确定的)都是海岸线,建图跑最小割即可。
注意相邻两点表示陆海的时候要反过来。
网络流之前打的模版有点慢,导致我一直TLE,这样做会快一点:
AC代码如下:
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define Maxn 4010 9 #define Maxm 4010*4 10 #define INF 0xfffffff 11 12 char s[60]; 13 14 int map[60][60]; 15 int dx[6]={ 0,-1,0,0,1}, 16 dy[6]={ 0,0,-1,1,0}; 17 int num[60][60]; 18 int s1[60][60],s2[60][60]; 19 20 struct node 21 { 22 int x,y,f,o,next; 23 }t[Maxm*2];int len; 24 25 int st,ed; 26 int dis[Maxn],first[Maxn]; 27 28 int mymin(int x,int y) { return x
2016-05-17 16:42:42