洛谷3227 切糕(最小割)

2021-08-21 20:41:01 字數 3443 閱讀 1494

題目描述

經過千辛萬苦小 a 得到了一塊切糕,切糕的形狀是長方體,小 a 打算攔腰將切糕切成兩半分給小 b。出於美觀考慮,小 a 希望切面能盡量光滑且和諧。於是她找到你,希望你能幫她找出最好的切割方案。

出於簡便考慮,我們將切糕視作乙個長 p、寬 q、高 r 的長方體點陣。我們將位於第 z層中第 x 行、第 y 列上(1≤x≤p, 1≤y≤q, 1≤z≤r)的點稱為(x,y,z),它有乙個非負的不和諧值 v(x,y,z)。乙個合法的切面滿足以下兩個條件:

與每個縱軸(一共有 p*q 個縱軸)有且僅有乙個交點。即切面是乙個函式 f(x,y),對於所有 1≤x≤p, 1≤y≤q,我們需指定乙個切割點 f(x,y),且 1≤f(x,y)≤r。

切面需要滿足一定的光滑性要求,即相鄰縱軸上的切割點不能相距太遠。對於所有的 1≤x,x』≤p 和 1≤y,y』≤q,若|x-x』|+|y-y』|=1,則|f(x,y)-f(x』,y』)| ≤d,其中 d 是給定的乙個非負整數。 可能有許多切面f 滿足上面的條件,小a 希望找出總的切割點上的不和諧值最小的那個。

輸入輸出格式

輸入格式:

第一行是三個正整數p,q,r,表示切糕的長p、 寬q、高r。第二行有乙個非負整數d,表示光滑性要求。接下來是r個p行q列的矩陣,第z個 矩陣的第x行第y列是v(x,y,z) (1<=x<=p, 1<=y<=q, 1<=z<=r)。 100%的資料滿足p,q,r<=40,0<=d<=r,且給出的所有的不和諧值不超過1000。

輸出格式:

僅包含乙個整數,表示在合法基礎上最小的總不和諧值。

qwq說實話 這個題一開始我連題意都沒有理解,

這裡是簡化版的題意

可以這麼來理解,就是先假設乙個平面有p∗

q p∗q

個點,然後對於每個點(i

,j) (i,

j)

,必須選擇乙個值

k k

,得到乙個不開心值v(

i,j,

k)' role="presentation" style="position: relative;">v(i

,j,k

)v(i

,j,k

),相鄰兩個點的

k k

值之差要小雨

d' role="presentation" style="position: relative;">d

d,求最小化不開心值的和qwq

其實一開始,看這個題…..沒什麼思路 嗯

看了題解,聽過某大佬的講解之後,才知道是個最小割

既然這樣,我們就不妨先忽略這個

d d

的限制條件,考慮沒有限制的情況

我們不妨設源點和匯點s,

t' role="presentation" style="position: relative;">s,t

s,t,增加乙個附加層r+

1 r+1

層然後s

s

向第一層的點連邊,r+

1' role="presentation" style="position: relative;">r+1

r+1層的邊向

t t

連邊對於中間的點,很顯然是(i

,j,k

)−>(i

,j,k

+1)' role="presentation" style="position: relative;">(i,

j,k)

−>(i

,j,k

+1)(

i,j,

k)−>(i

,j,k

+1)流量為v(

i,j,

k)v (i

,j,k

),很容易證明,這樣跑最小割,每乙個縱軸,會且僅會切一道。

那麼加上限制…..該怎麼限制呢

讓刪除這些邊 不影響連通 不就好了咯

對於相鄰的兩個點(i

,j) (i,

j)

和(x,y

) (x,

y)

,我們將(i

,j,k

)−>(x

,y,k

−d) (i,

j,k)

−>(x

,y,k

−d

)流量是in

f inf

就能保證qwq當(i

,j) (i,

j)

選了k的時候,(x

,y) (x,

y)

必須要弄距離是d以內的

qwq相反同理

然後….一定一定記得看清楚讀入的順序

#include

#include

#include

#include

#include

#include

using

namespace

std;

inline

int read()

while (isdigit(ch))

return x*f;

}const

int maxn = 55;

const

int maxm = 2e6+1e2;

const

int inf = 1e9;

int a[maxn][maxn][maxn];

int point[100010],nxt[maxm],val[maxm],to[maxm];

int h[100010];

queue

que;

int cnt=1;

int s,t;

int dx[5]=;

int dy[5]=;

void addedge(int x,int y,int w)

void insert(int x,int y,int w)

bool bfs(int s)}}

if (h[t]==-1) return

false;

else

return

true;

}int dfs(int x,int low)

}if (low>0) h[x]=-1;

return totflow;

}int solve()

return ans;

}int p,q,r;

int d;

int main()

for (int i=1;i<=p;i++)

}} for (int i=1;i<=p;i++)

for (int j=1;j<=q;j++)

for (int i=1;i<=p;i++)

for (int j=1;j<=q;j++)}}

cout

0;}

洛谷P3227 HNOI2013 切糕

題目大意 有乙個 n times m 的切糕,每乙個位置的高度可以在 1,k 之間,每個高度有乙個代價,要求四聯通的兩個格仔之間高度最多相差 d 問可行的最小代價。n,m,k,d leqslant 40 題解 網路流,不考慮相差為 d 的條件時,可以給每個位置建乙個點,源點連向高度為 1 的點容量為...

cogs 2398 切糕 最小割

cogs 2398 切糕 題解 若沒有d的限制,我們建模應該是這樣的。跑乙個最小割即可。有了d的限制,那麼存在點對 i,j 要求i,j的割邊距離差不能超過d,假設d是1,圖應該是這樣。如果割斷了v 1,1 是不會割斷v 2,3 的,我們假設割斷的是v 2,3 那麼此時會有一條路從v 2,2 的後繼點...

網路流 最小割 洛谷P1345

很不幸,有時候奶牛會不小心踩到電腦上,農夫約翰的車也可能碾過電腦,這台倒霉的電腦就會壞掉。這意味著這台電腦不能再傳送電郵了,於是與這台電腦相關的連線也就不可用了。有兩頭奶牛就想 如果我們兩個不能互發電郵,至少需要壞掉多少臺電腦呢?請編寫乙個程式為她們計算這個最小值。以如下網路為例 1 3 2 這張圖...