题意:有一个区域,有'.'的陆地,'D'的深海域,'E'的浅海域。其中浅海域可以填充为陆地。这里的陆地区域不联通,并且整个地图都处在海洋之中。问填充一定浅海域之后所有岛屿的最长的海岸线之和。
解法:最小割。从“分隔”陆地和海域可以想到“割”的概念,然后我们先不考虑浅海域,要深海域和陆地的对数尽量大,也就是相同的地理构造对数尽量小。
于是我们建立一个二分图,深海域和陆地都分列两侧,对于相邻的一个在左,一个在右,也就是“行+列”是奇数的放左,偶数的在右。而对于相邻的深海域和陆地,它们在图中理应分列两侧,才有“相连”的意义。(唉,我算是“梗着脖子”地在解释......~(-仝-)~)于是可以深海域的奇数的在左,而陆地的偶数的在左。 接着建立一个源点和汇点,左侧的点与源点相连,右侧的点与汇点相连。由于无约束,边容量为INF。而4个方向相邻的都“相连”,便建边,容量为1,表示割这条边的代价就是1。又因为这整个地图都处在海洋之中,也就是这个地图外围是一圈深海域,这是隐含条件,所以还需要另外建这些点和对应的边。 最后,用最大流算法求出最小割,表示相同的地理构造的最少的对数,而最长的海岸线就是最多的不同的构造,也就是总对数-最少的相同的地理构造的对数。1 #include2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 8 const int N=50,NN=3000,MM=30000,INF=20000; 9 int n,m,len=1; 10 int last[NN],d[NN]; 11 int dx[4]={ 0,0,1,-1},dy[4]={ 1,-1,0,0}; 12 char s[N][N]; 13 struct node{ int x,y,fl,next;}a[MM]; 14 queue q; 15 16 int mmin(int x,int y) { return x n||y>m) continue;103 ins(t,tt,1);104 }105 }106 }107 int ans=Max_flow(st,ed);108 ans=(n-1)*m+(m-1)*n-ans;109 printf("Case %d: %d\n",kase,ans);110 }111 return 0;112 }