HNOI2003 消防局的設立

2022-05-05 18:06:11 字數 1251 閱讀 3378

傳送門

這道題似乎是夾克老爺的憤怒那道題的弱化版……?這次的距離是固定為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 的...