歡迎來到珠海!
由於土地資源越來越緊張,使得許多海濱城市都只能依靠填海來擴充套件市區以求發展。作為z市的決策人,在仔細觀察了z市地圖之後,你準備通過填充某些海域來擴充套件z市的海岸線到最長,來吸引更多的遊客前來旅遊度假。為了簡化問題,假設地圖為乙個n*m的格仔,其中一些是陸地,一些是可以填充的淺海域,一些是不可填充的深海域。這裡定義海岸線的長度為乙個聯通塊陸地(可能包含淺海域填充變為的陸地)的邊緣長度,兩個格仔至少有乙個公共邊,則視為聯通。
值得注意的是,這裡z市的陸地區域可以是不聯通的,並且整個地圖都處在海洋之中,也就是說,z市是由一些孤島組成的,比如像,夏威夷?
你的任務是,填充某些淺海域,使得所有島嶼的海岸線之和最長。
輸入第一行為t,表示有t組測試資料。
每組資料以兩個整數n和m開始,表示地圖的規模。接下來的n行,每一行包含乙個長度為m的字串,表示地圖,『.』表示陸地,』e』表示淺海域,』d』表示深海域。
[technical specification]
1 <= t <= 100
1 <= n, m <= 47
對每組資料,先輸出為第幾組資料,然後輸出最長的海岸線長度。
2 2ee
ee3 3
eee.e.
eee3 3
eeeded
eeecase 1: 8
case 2: 16
case 3: 20
題目很顯然就是要求d和.相鄰的邊,個數最多,我們轉換一下,就是求相鄰的邊相同的最少。
求最小割模型
黑白染色之後,e無視,如果黑色的.或者白色的d,我們就連s,否則連t,容量都是inf
這樣建邊後,如果要從源點流向匯點,那麼肯定是.->.或者d->d
所以求最小割就好了
#includeusing namespace std;
const int maxn=100000,maxm=100000,inf=1e9;
struct edge
edge(int v,int c,int f,int nx):v(v),c(c),f(f),nx(nx) {}
} e[maxm];
int g[maxn],cur[maxn],pre[maxn],dis[maxn],gap[maxn],n,sz;
void init(int _n)
void link(int u,int v,int c)
bool bfs(int s,int t)}}
return dis[t]!=-1;
}int dfs(int u,int t,int low)}}
if (!ret) dis[u]=-1; return ret;
}int dinic(int s,int t)
return maxflow;
}char ss[120][120];
int dx[4]=;
int dy[4]=;
int get(int x,int y)
int main()
if(ss[i][j]!='e')}}
int now = dinic(s,t);
printf("case %d: %d\n",cas,temp/2-now);
}}
HDU 4859 海岸線 最小割
強烈建議閱讀一下最小割模型在資訊學競賽中的應用 其中2.2.2的optimal marks一題和此題建模非常相像。在原圖外圍虛擬一圈 d 我們要最大化的周長,就可以等價為最大化相鄰的 d 和 的總對數,也就是最大化相鄰格仔不同型別的總對數。按照 中的建圖方式,我們可以最小化相鄰格仔不同型別,反過來想...
hdu 4859 海岸線(最小割)
題目 建模 一種新的建圖思路 周圍加了一圈d,令d為奇,為偶,若d確實為奇,與ss連inf,若為偶,與tt 連 inf。同理。然後與周圍的點連 1 盡量保持不變的 習慣,最小割就從 1,1 開始建。include include include include include include def...
HDU 4859 海岸線 最小割
這題考察的是最小割。我們可以這樣想 海岸線的長短變化都是e引起的,我們通過把 e 變成 或 d 來使海岸線最大化。我們要算海岸線就是算格仔 和格仔 d 在原有地圖周圍四面都要加 d 相鄰的面數,要使它最大,就是要使 與 d 與 d 相鄰的面數最小,而面數最小可以用最小割來做。現在我們先把格仔上的點黑...