傳送門
這道題似乎是夾克老爺的憤怒那道題的弱化版……?這次的距離是固定為2的。
我們首先考慮一下只有一條鏈的情況,這個誰都會,就是每隔2k(k為給定距離)個點放乙個,就是這樣貪心。樹也可以用這種貪心法來求解,我們從葉子節點往上dp,每次用dp[i]表示這個點還能往上控制距離為多少的點,如果當前的dp值為-2的話,就新建立乙個消防局,並把dp值改為2,同時還要記錄當前點所有子節點dp值的最大和最小值,如果二者和大於零,那就說明這個點可以被自己的某個子節點控制,那麼dp值就是最大值-1,否則的話,dp值就是最小值-1。
這樣直接dp即可,最後到根節點的時候,如果dp值小於0,那麼還需要多建立乙個消防局。
看一下**。
#include#include#include
#include
#include
#include
#include
#define rep(i,a,n) for(int i = a;i <= n;i++)
#define per(i,n,a) for(int i = n;i >= a;i--)
#define enter putchar('\n')
using
namespace
std;
typedef
long
long
ll;const
int m = 100005
;const
int inf = 1000000009
;int
read()
while(ch >= '
0' && ch <= '9'
)
return ans *op;
}struct
edge
e[m];
intn,head[m],ecnt,dp[m],x,y,ans;
void add(int x,int
y)void dfs(int x,int
fa)
if(minn == inf) dp[x] = -1
;
else
if(minn <= -2) ans++,dp[x] = 2
;
else
if(minn + maxn > 0) dp[x] = maxn - 1
;
else dp[x] = minn - 1;}
intmain()
HNOI2003 消防局的設立
2020年,人類在火星上建立了乙個龐大的基地群,總共有n個基地。起初為了節約材料,人類只修建了n 1條道路來連線這些基地,並且每兩個基地都能夠通過道路到達,所以所有的基地形成了乙個巨大的樹狀結構。如果基地a到基地b至少要經過d條道路的話,我們稱基地a到基地b的距離為d。由於火星上非常乾燥,經常引發火...
HNOI2003 消防局的設立
2020年,人類在火星上建立了乙個龐大的基地群,總共有n個基地。起初為了節約材料,人類只修建了n 1條道路來連線這些基地,並且每兩個基地都能夠通過道路到達,所以所有的基地形成了乙個巨大的樹狀結構。如果基地a到基地b至少要經過d條道路的話,我們稱基地a到基地b的距離為d。由於火星上非常乾燥,經常引發火...
HNOI 2003 消防局的設立
題目描述 2020 年,人類在火星上建立了乙個龐大的基地群,總共有 n 個基地。起初為了節約材料,人類只修建了 n 1 條道路來連線這些基地,並且每兩個基地都能夠通過道路到達,所以所有的基地形成了乙個巨大的樹狀結構。如果基地 a 到基地 b 至少要經過 d 條道路的話,我們稱基地 a 到基地 b 的...