洛谷 2279 HNOI2003 消防局的設立

2022-08-22 15:12:28 字數 1400 閱讀 1829

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

輸出檔名為output.txt

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

輸入樣例#1:

612345

輸出樣例#1:

2

solution

方法1:貪心

轉化為一棵以1為根節點的有根樹,考慮深度最大的節點,當覆蓋它的節點為它的父節點的父節點時,是最優的(反證法)

舉個栗子,考慮節點5時,1,3,4都可以覆蓋它,但是3,4能覆蓋的節點1都可以覆蓋(因為3,4的深度小一點,覆蓋的點的深度也小一點,但是5是深度最大的點,沒有深度更大的點了)

所以可以以深度為關鍵字排序,每次找到深度最大的節點,從這個節點出發走4個距離的點都標為已覆蓋

#include#include#include#include#include#include#include#define nn 1011

using namespace std;

int vis[nn],dis[nn],fir[nn],nxt[nn<<1],to[nn<<1],e=0;

struct node

while(isdigit(ch))

return ans*f;

}void add(int u,int v)

void solve(int x,int fa,int use)

int main()

while(!q.empty()) }

printf("%d",ans);

return 0;

}

方法2:樹形dp

洛谷 2279 HNOI2003 消防局的設立

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

洛谷 P2279 HNOI2003 消防局的設立

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

洛谷 P2279 HNOI2003 消防局的設立

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