題目描述
經過千辛萬苦小 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 這張圖...