UVA - 10859 Placing Lampposts 放置街灯
Placing Lampposts
傳送門(mén):https://vjudge.net/problem/UVA-10859
題目大意:給你一片森林,要求你在一些節(jié)點(diǎn)上放上燈,一個(gè)點(diǎn)放燈能照亮與之相連的所有的邊。問(wèn)你最小化防止的燈數(shù),在燈數(shù)相同的條件下,最大化兩個(gè)點(diǎn)都有燈的邊數(shù)。
題解:
首先有一個(gè)套路,也是做了此題才知道的,很神奇啊。最小化燈的數(shù)量,我們?cè)O(shè)燈數(shù)為V1,把“最大化兩個(gè)點(diǎn)都有燈的邊數(shù)”轉(zhuǎn)化為“最下化只有一個(gè)點(diǎn)有燈的邊數(shù)”,設(shè)為V2,那么我們?cè)O(shè)Val=Eps*V1+V2。這樣只要DP一個(gè)值就可以了。Eps設(shè)成一個(gè)足夠大的值,保證Eps>sum{V2}。此題姑且設(shè)為2000。
然后我們就可以DP了。樹(shù)上求解最優(yōu)解,此題為森林,轉(zhuǎn)化為每棵樹(shù)的答案相加就可以了。那么怎么DP呢?
設(shè)狀態(tài)DP[i]代表i節(jié)點(diǎn)與它的子樹(shù)以及連向父親的那一條邊的最小的Val。每一個(gè)節(jié)點(diǎn)有放燈與不放燈兩種狀態(tài),但是我們發(fā)現(xiàn),父親放不放燈會(huì)影響兒子放不放燈,那么我們?cè)偌由弦痪S的狀態(tài):dp[i][0/1]代表代表i節(jié)點(diǎn)與它的子樹(shù)以及連向父親的那一條邊的最小的Val,j=1為父親放燈,j=0代表父親不放燈。
考慮兩種方案:
1. i放燈:i放燈的話(huà),對(duì)于其他的沒(méi)有什么要求,所以dp[i][j]+=dp[son][1],dp[i][j]+=Eps。如果當(dāng)前j==0,并且不是根節(jié)點(diǎn),那么dp[i][j]++,因?yàn)榈礁赣H的那一條邊只有1個(gè)燈。
2. i不放燈:i不放燈,轉(zhuǎn)移就有限制條件了,必須父親放燈,或者i為根節(jié)點(diǎn),dp[i][1]+=dp[son][0],如果i不是根節(jié)點(diǎn),那么還要++,同樣的因?yàn)榈礁赣H的那一條邊只有1個(gè)燈。
然后一邊dfs一邊DP就可以了。注意狀態(tài)轉(zhuǎn)移是錯(cuò)綜復(fù)雜的,并不是單一的0->1或0->0,具體順序見(jiàn)代碼。
條件1可以更新j=1和0的情況;條件2只能更新j=1的情況,但是在根節(jié)點(diǎn)也可以更新j=0的情況。
?
轉(zhuǎn)載于:https://www.cnblogs.com/D-O-Time/p/7663692.html
總結(jié)
以上是生活随笔為你收集整理的UVA - 10859 Placing Lampposts 放置街灯的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Linux系统的常用命令的使用
- 下一篇: 「超全」工欲善其事必先利其器!