hdu 4859 海岸線 最小割

2022-03-31 16:50:09 字數 1610 閱讀 6069

歡迎來到珠海!

由於土地資源越來越緊張,使得許多海濱城市都只能依靠填海來擴充套件市區以求發展。作為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 相鄰的面數最小,而面數最小可以用最小割來做。現在我們先把格仔上的點黑...