題目描述
2023年,人類在火星上建立了乙個龐大的基地群,總共有n個基地。起初為了節約材料,人類只修建了n-1條道路來連線這些基地,並且每兩個基地都能夠通過道路到達,所以所有的基地形成了乙個巨大的樹狀結構。如果基地a到基地b至少要經過d條道路的話,我們稱基地a到基地b的距離為d。
由於火星上非常乾燥,經常引發火災,人類決定在火星上修建若干個消防局。消防局只能修建在基地裡,每個消防局有能力撲滅與它距離不超過2的基地的火災。你的任務是計算至少要修建多少個消防局才能夠確保火星上所有的基地在發生火災時,消防隊有能力及時撲滅火災。
輸入描述:
輸入檔案的第一行為n,表示火星上基地的數目。
接下來的n-1行每行有乙個正整數,其中檔案第i行的正整數為a[i],表示從編號為i的基地到編號為a[i]的基地之間有一條道路,為了更加簡潔的描述樹狀結構的基地群,有a[i]
輸出描述:
輸出檔案僅有乙個正整數,表示至少要設立多少個消防局才有能力及時撲滅任何基地發生的火災。
示例1輸入複製6
1234
5輸出複製2
這是在樹形dp環節見到的這個題目,但是樹形dp偷看了一下題解,有點小麻煩。。就換成貪心來做了。我們對於一條鏈上的節點來說,在葉子節點建立基地的效果一定沒有在他的祖父節點建立基地的效果好。因為他的祖父節點還可以往上惠澤上面的節點。這就是貪心的思想。我們dfs一遍出來的是各個節點的深度和他們各自的父親節點。按著深度排序,用剛才的想法去貪心求就可以了。
**如下:
#include
#define ll long long
using
namespace std;
const
int maxx=
1e5+
100;
struct edgee[maxx<<1]
;int head[maxx<<1]
,fa[maxx]
,deep[maxx]
,a[maxx]
,dis[maxx]
;int tot,n;
/*-----------事前準備-------------*/
inline
void
init()
inline
void
add(
int u,
int v)
inline
bool
cmp(
int a,
int b)
/*-------------dfs------------*/
inline
void
dfs(
int u,
int f)
}/*--------------貪心--------------*/
inline
intsolve()
return ans;
}int
main()
deep[0]
=0;dfs(1
,0);
printf
("%d\n"
,solve()
);}return0;
}
努力加油a啊,(o)/~ HNOI2003 消防局的設立
2020年,人類在火星上建立了乙個龐大的基地群,總共有n個基地。起初為了節約材料,人類只修建了n 1條道路來連線這些基地,並且每兩個基地都能夠通過道路到達,所以所有的基地形成了乙個巨大的樹狀結構。如果基地a到基地b至少要經過d條道路的話,我們稱基地a到基地b的距離為d。由於火星上非常乾燥,經常引發火...
HNOI2003 消防局的設立
2020年,人類在火星上建立了乙個龐大的基地群,總共有n個基地。起初為了節約材料,人類只修建了n 1條道路來連線這些基地,並且每兩個基地都能夠通過道路到達,所以所有的基地形成了乙個巨大的樹狀結構。如果基地a到基地b至少要經過d條道路的話,我們稱基地a到基地b的距離為d。由於火星上非常乾燥,經常引發火...
HNOI2003 消防局的設立
傳送門 這道題似乎是夾克老爺的憤怒那道題的弱化版 這次的距離是固定為2的。我們首先考慮一下只有一條鏈的情況,這個誰都會,就是每隔2k k為給定距離 個點放乙個,就是這樣貪心。樹也可以用這種貪心法來求解,我們從葉子節點往上dp,每次用dp i 表示這個點還能往上控制距離為多少的點,如果當前的dp值為 ...