HNOI2003 消防局的設立

2021-08-15 15:57:46 字數 1343 閱讀 2906

2023年,人類在火星上建立了乙個龐大的基地群,總共有n個基地。起初為了節約材料,人類只修建了n-1條道路來連線這些基地,並且每兩個基地都能夠通過道路到達,所以所有的基地形成了乙個巨大的樹狀結構。如果基地a到基地b至少要經過d條道路的話,我們稱基地a到基地b的距離為d。

由於火星上非常乾燥,經常引發火災,人類決定在火星上修建若干個消防局。消防局只能修建在基地裡,每個消防局有能力撲滅與它距離不超過2的基地的火災。

你的任務是計算至少要修建多少個消防局才能夠確保火星上所有的基地在發生火災時,消防隊有能力及時撲滅火災。

輸入格式:

輸入檔名為input.txt。

輸入檔案的第一行為n (n<=1000),表示火星上基地的數目。接下來的n-1行每行有乙個正整數,其中檔案第i行的正整數為a[i],表示從編號為i的基地到編號為a[i]的基地之間有一條道路,為了更加簡潔的描述樹狀結構的基地群,有a[i]

輸出格式:

輸出檔名為output.txt

輸出檔案僅有乙個正整數,表示至少要設立多少個消防局才有能力及時撲滅任何基地發生的火災。

一看就以為是樹形dp。。。

其實貪心就行了。

由於消防站只能控制兩格,即爺爺和兄弟,所以,每次找最深的節點,再向上找爺爺,建立消防站即可。

#include

#include

using

namespace

std;

const

int maxn=1000+5,maxm=2000+5;

int head[maxn];

int ans=0,len=1,n,x;

struct t

tree[maxm];

void add(int u,int v)

int dfs(int root,int mark)

df_son=dfs(son,root);

maxx=max(df_son,maxx);

minn=min(df_son,minn);

bb=false;

}if(bb) return

3; if(maxx+1==5)

if(root==1)

if(maxx>2&&minn>0) ans++;

else

if(minn>1) ans++;

if(maxx<=3&&minn<=0) return minn+1;

if(maxx<=2&&minn<=1) return minn+1;

return maxx+1;

}int main()

dfs(1,0);

printf("%d",ans);

}

HNOI2003 消防局的設立

2020年,人類在火星上建立了乙個龐大的基地群,總共有n個基地。起初為了節約材料,人類只修建了n 1條道路來連線這些基地,並且每兩個基地都能夠通過道路到達,所以所有的基地形成了乙個巨大的樹狀結構。如果基地a到基地b至少要經過d條道路的話,我們稱基地a到基地b的距離為d。由於火星上非常乾燥,經常引發火...

HNOI2003 消防局的設立

傳送門 這道題似乎是夾克老爺的憤怒那道題的弱化版 這次的距離是固定為2的。我們首先考慮一下只有一條鏈的情況,這個誰都會,就是每隔2k k為給定距離 個點放乙個,就是這樣貪心。樹也可以用這種貪心法來求解,我們從葉子節點往上dp,每次用dp i 表示這個點還能往上控制距離為多少的點,如果當前的dp值為 ...

HNOI 2003 消防局的設立

題目描述 2020 年,人類在火星上建立了乙個龐大的基地群,總共有 n 個基地。起初為了節約材料,人類只修建了 n 1 條道路來連線這些基地,並且每兩個基地都能夠通過道路到達,所以所有的基地形成了乙個巨大的樹狀結構。如果基地 a 到基地 b 至少要經過 d 條道路的話,我們稱基地 a 到基地 b 的...